Got around to doing some testing.
My test code:
#define PIN 2
uint8_t myPort;
uint8_t myPinBit;
void setup() {
pinMode(PIN, OUTPUT);
Serial.begin(115200);
myPort = portOutputRegister(digitalPinToPort(PIN));
myPinBit = digitalPinToBitMask(PIN);
}
void loop() {
unsigned long startTime = micros();
for (long i = 0; i < 100000UL; i++) {
digitalWrite(PIN, HIGH);
digitalWrite(PIN, LOW);
}
float digWriteSpeed = (micros() - startTime)/200000.00;
Serial.print("digitalWrite() ");
Serial.print(digWriteSpeed);
startTime = micros();
for (long i = 0; i < 100000UL; i++) {
myPort |= myPinBit;
myPort &= ~myPinBit;
}
float portManipSpeed = (micros() - startTime)/200000.00;
Serial.print("us, Port Manipulation ");
Serial.print(portManipSpeed);
Serial.print("us which is ");
Serial.print(digWriteSpeed/portManipSpeed);
Serial.println(" times faster");
}
Arduino Nano 3 (atmega328 @ 16MHz):
digitalWrite() 3.59us, Port Manipulation 0.28us which is 12.65 times faster
Arduino Pro Micro (atmega32u4 @ 16MHz):
digitalWrite() 3.67us, Port Manipulation 0.28us which is 12.89 times faster