> ICh würde schätzen, dass memset() schneller ist, weil es handoptimiert
> ist (ASM?).
Naja, beim AVR gibt's nicht viele Möglichkeiten, einen Speicherblock zu
kopieren, und der C-Code für die Schleife ist so einfach, daß ich schon
mit einem optimalen Ergebnis gerechnet hätte.
> Simulier einfach mal beide im AVR Studio und schau dir die
> benötigten Taktzyklen an.
Ich habe kein AVR-Studio, aber ich kann mir den ASM-Code anschauen:
For-Schleife:
1 | ldi r30,lo8(cache)
|
2 | ldi r31,hi8(cache)
|
3 | .L2:
|
4 | st Z+,__zero_reg__
|
5 | ldi r24,hi8(cache+1024)
|
6 | cpi r30,lo8(cache+1024)
|
7 | cpc r31,r24
|
8 | brne .L2
|
memcpy:
1 | ldi r24,lo8(1024)
|
2 | ldi r25,hi8(1024)
|
3 | ldi r30,lo8(cache)
|
4 | ldi r31,hi8(cache)
|
5 | st Z+,__zero_reg__
|
6 | sbiw r24,1
|
7 | brne .-6
|
Die memcpy-Variante ist tatsächlich pro Durchlauf einen Taktzyklus
schneller, aber nur weil bei der for-Schleife das Register r24 in jedem
Schleifendurchlauf unnötigerweise neu geladen wird. Sonst wären die
beiden gleich schnell.