pYro_65:
The results are in, they were partly as I expected.
...
An older test (2011) for the same problem - Byte mirroring - #24 by robtillaart - Programming Questions - Arduino Forum -
- global lookup table with 256 values - in flash - beats all in speed : < 1 uSec / flip
- global lookup table with 16 values - idem - is a good runner up: < 3 usec / flip
(2) is almost identical too HazardsMinds except for - global array vs local array.
For the footprint the array should be in PROGMEM... (as PeterH pointed out earlier in this thread!)
void setup()
{
Serial.begin(115200);
}
// big lookup table
prog_uchar flip[256] PROGMEM = { 0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,8,136,72,200,40,168,104,232,24,152,88,216,56,184,120,248,4,132,68,196,36,164,100,228,20,148,84,212,52,180,116,244,12,140,76,204,44,172,108,236,28,156,92,220,60,188,124,252,2,130,66,194,34,162,98,226,18,146,82,210,50,178,114,242,10,138,74,202,42,170,106,234,26,154,90,218,58,186,122,250,6,134,70,198,38,166,102,230,22,150,86,214,54,182,118,246,14,142,78,206,46,174,110,238,30,158,94,222,62,190,126,254,1,129,65,193,33,161,97,225,17,145,81,209,49,177,113,241,9,137,73,201,41,169,105,233,25,153,89,217,57,185,121,249,5,133,69,197,37,165,101,229,21,149,85,213,53,181,117,245,13,141,77,205,45,173,109,237,29,157,93,221,61,189,125,253,3,131,67,195,35,163,99,227,19,147,83,211,51,179,115,243,11,139,75,203,43,171,107,235,27,155,91,219,59,187,123,251,7,135,71,199,39,167,103,231,23,151,87,215,55,183,119,247,15,143,79,207,47,175,111,239,31,159,95,223,63,191,127,255};
void loop()
{
unsigned long start = micros();
for (int i=0; i<256; i++)
{
volatile uint8_t b = i;
b = pgm_read_byte_near(flip + b);
b = pgm_read_byte_near(flip + b);
}
Serial.println(micros() - start);
for (int i=0; i<256; i++)
{
volatile uint8_t b = i;
b = pgm_read_byte_near(flip + b);
b = pgm_read_byte_near(flip + b);
Serial.print(b);
Serial.print(',');
}
Serial.println();
while (1);
}
468 usec (512 flips) => less than 1 usec / flip (including loop overhead)