Fyra olika grupper med olika metoder: Multiplikation, Shift, Addition, Loopar.
Snabbast: shiftoperationer med "((a << 2) + a) << 1"
Snålast med programminne: Nedåträknande loopar "while" eller "for"
Snålast med ramminne: Ingen som är bäst eftersom många av metoderna tog bara 6 byte.
Vilken som är bäst totalt sett går nog inte att utse.
En intressant sak man kan se att det är bra att använda *= eller += .
En annan intressant sak är att while och for är lika bra.
Först trodde jag while var bättre, men när jag även gjort for-loopen nedåträknande var den lika bra.
Personligen gillar jag while bättre, eftersom den är mera lättläst.
För testerna har jag använt MPLAB 8.88, Hitech C 9.83, MPLAB SIM, PIC 16F1825
Kod: Markera allt
// Multiplikation
uInt16 a;
a = 123;
a = a * 10;
// programminne: 59 ram: 8 instruktionscykler: 211
uInt16 a;
a = 123;
a *= 10;
// programminne: 59 ram: 8 instruktionscykler: 133
// Shift
uInt16 a;
a = 123;
a = (a << 3) + a + a;
// programminne: 25 ram: 6 instruktionscykler: 35
uInt16 a;
a = 123;
a = (a << 3) + (a << 1);
// programminne: 28 ram: 6 instruktionscykler: 38
uInt16 a;
a = 123;
a = ((a << 2) + a) << 1;
// programminne: 28 ram: 6 instruktionscykler: 33
// Addition
uInt16 a;
a = 123;
a = a + a + a + a + a + a + a + a + a + a;
// programminne: 62 ram: 18 instruktionscykler: 62
uInt16 a;
uInt16 c;
a = 123;
c = a + a;
c = c + c + a;
c = c + c;
// programminne: 45 ram: 6 instruktionscykler: 45
uInt16 a;
uInt16 c;
a = 123;
c = a + a;
c = c + c + c + c + c;
// programminne: 44 ram: 10 instruktionscykler: 44
uInt16 a;
uInt16 c;
a = 123;
c = a + a;
c += c + a;
c += c;
// programminne: 35 ram: 6 instruktionscykler: 35
uInt16 a;
uInt16 c;
a = 123;
c = a + a;
c += c + c + c + c;
// programminne: 42 ram: 10 instruktionscykler: 42
// Loopar
uInt16 a;
uInt8 b;
uInt16 c;
a = 123;
c = 0;
for ( b=0; b<10; b++ )
c += a;
// programminne: 29 ram: 6 instruktionscykler: 163
uInt16 a;
uInt8 b;
uInt16 c;
a = 123;
c = 0;
b = 10;
while (b)
{
c += a;
b--;
}
// programminne: 22 ram: 6 instruktionscykler: 137
uInt16 a;
uInt8 b;
uInt16 c;
a = 123;
c = 0;
for ( b=10; b; b-- )
c += a;
// programminne: 22 ram: 6 instruktionscykler: 137