mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Memset via schleife


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,


ich möchte die variable cache mit 0x00 initialisieren.
Kann mir jemand kurz erläutern welche Variante die bessere oder 
schnellere ist?
char cache[1024];

//Variante 1
for (int i=0;i<1024;i++)  cache[i] =0x00;

//Variante 2
memset(cache,0x00,sizeof(cache));

HW: ATMEGA128

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde schätzen, daß auf einem AVR beide gleich schnell sind.
Es würde mich nicht wundern, wenn der Compiler erkennt, was die 
for-Schleife tut und diese automatisch durch einen memset-Aufruf 
ersetzt. Dieser wiederum wird (zumindest bei GCC) vom Compiler selbst 
intern dann in die optimale Variante für den jeweiligen Prozessor 
umgesetzt.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Rolf Magnus (Gast)

>Ich würde schätzen, daß auf einem AVR beide gleich schnell sind.

ICh würde schätzen, dass memset() schneller ist, weil es handoptimiert 
ist (ASM?).

>Es würde mich nicht wundern, wenn der Compiler erkennt, was die
>for-Schleife tut und diese automatisch durch einen memset-Aufruf
>ersetzt.

Würde ich nicht drauf spekulieren.

> Dieser wiederum wird (zumindest bei GCC) vom Compiler selbst
>intern dann in die optimale Variante für den jeweiligen Prozessor
>umgesetzt.

Praktisch. Simulier einfach mal beide im AVR Studio und schau dir die 
benötigten Taktzyklen an.

MFG
Falk

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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:
        ldi r30,lo8(cache)
        ldi r31,hi8(cache)
.L2:
        st Z+,__zero_reg__
        ldi r24,hi8(cache+1024)
        cpi r30,lo8(cache+1024)
        cpc r31,r24
        brne .L2

memcpy:
        ldi r24,lo8(1024)
        ldi r25,hi8(1024)
        ldi r30,lo8(cache)
        ldi r31,hi8(cache)
        st Z+,__zero_reg__
        sbiw r24,1
        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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.