Dauer einer Instruktion ermitteln

Gast #6261435
du könnstest dir beide Implementierungen in assembler ansehen und die 
cycles zählen 
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0439b/CHDDIGAC.html 
sagt dir welcher befehl wie lange braucht.
Oder du Startest einen Hardwaretimer vor der Operation und stoppst 
danach die Differenz ist der wert der dich interessiert.
Aber generell meistens verbraten Programme die meiste Zeit an ecken wo 
man sie nicht vermutet. Bist du sicher des dieser Punkt die "low Hanging 
Fruit" ist das es sich lohnt hier zu optimieren ?
Gast #6261471
Danke, das hab ich gesucht!
In Assembler hat der Compiler jeweils einen Einzeiler draus gemacht. 
UDIV xyz oder eben LSRS xyz.
Laut der Tabelle braucht der Letztere aber nur einen Cycle im Vergleich 
zum UDIV, das 2 bis 12 braucht.

Es ist auch nicht so, dass ich Zeitprobleme hätte, aber wenns schneller 
geht, warum nicht :)
#6261510
STM32F4 hat 'nen Zyklenzähler in DWT->CYCCNT.

UDIV hat eine von den Werten abhängige Zyklenzahl.

Aber der Fallback auf LSRS lohnt sich IMHO nur wenn der Wert fest auf 
einer Zweierpotenz steht (#define oder const).
Denn die Überprüfung würde länger dauern...

Übrigens ist der C Optimizer durchaus in der Lage diese Fälle zu 
erkennen um dann die kürzere Instruktion zu verwenden.
Gast #6261537
pc schrieb:
> Es ist auch nicht so, dass ich Zeitprobleme hätte, aber wenns schneller
> geht, warum nicht :)

Wartbarkeit? Code wird öfters gelesen als geschrieben, von daher sollte 
man, wenn es keine äußeren Einflüsse gibt, erstmal auf leichtes 
Verständnis Optimieren, anstatt sich auf angenommene Optimierungen zu 
stürzen.
Gast #6261622
Imonbln schrieb:
> Wartbarkeit? Code wird öfters gelesen als geschrieben, von daher sollte
> man, wenn es keine äußeren Einflüsse gibt, erstmal auf leichtes
> Verständnis Optimieren, anstatt sich auf angenommene Optimierungen zu
> stürzen.

Ob da mit erklärendem Kommentar
1
val = GetAdcVal()*1487/1000; // compiler macht UDIV daraus

steht oder
1
val = GetAdcVal()*1523/1024; // compiler macht 10 shifts daraus

macht dann auch keinen Unterschied mehr.
Gast #6261751
pc schrieb:
> Ob da mit erklärendem Kommentar
> val = GetAdcVal()*1487/1000; // compiler macht UDIV daraus
> steht oder
> val = GetAdcVal()*1523/1024; // compiler macht 10 shifts daraus
> macht dann auch keinen Unterschied mehr.

Stimmt in beiden fällen, wäre es wartungsfreundlicher zu erklären was es 
mit dem Faktor 1.48 auf sich hat. Außerdem glaube ich Kommentaren à la 
„Compiler macht UDIV daraus“ grundsätzlich nicht, das nächste Update 
oder eine andere Parametrierung, wird diese Annahme zunichte machen. Von 
daher würde ich auf solchen Voodoo nicht zu viel Zeit verschwenden oder 
sehr genau Dokumentieren unter welchen Umständen, die Aussage valide 
ist. Vielleicht gibt es zu ein paar Nicht Standard Erweiterungen deines 
Compiler, um die Postuliert Annahme im Kommentar zu erzwingen, aber das 
ist ein anderes Thema…

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.