|
|
ArithmetikBenchmark[Bearbeiten] Benchmarks der Arithmetik-Funktionen auf einem AVRIm Netz fanden sich leider keine geeigneten Informationen, wie lange ein AVR für eine Berechnung mit Datentypen verschiedener Größe benötigt. Daher hier die Ergebnisse meines Benchmarkprogramms. Ausgeführt wurde das Programm auf einem ATmega328p. Compiliert wurde mit avr-gcc 4.3.2 und avr-libc 1.6.2.cvs20080610-2. Das sind die Versionen, die bei einem aktuellem Debian (stand März 2010) mit geliefert werden. Compiliert wurde mit einer Optimierung für minimale Größe. Zum Messen der benötigten Ticks (CPU Zyklen) wurde der 16 Bit Timer1 verwendet. Um zu verhindern, dass die Berechnungen außerhalb des Start und Stopp Codes des Timers erfolgten, wurden die Variablen volatile deklariert. Dies erzeugt gegebenenfalls ein paar extra Ticks, die in der Praxis weg optimiert werden. Auch für das Starten und Stoppen des Timers werden ein paar Ticks zu viel gezählt. Insbesondere bei den 8 Bit Berechnungen ist dies deutlich zu sehen. Gerechnet wurde hier mit den Beispielzahlen a = 123456789123450 und b = 512. Bei den Berechnungen mit weniger Bits, wurden die Zahlen entsprechend abgeschnitten. Insbesondere bei den Double Berechnungen hängt die Laufzeit auch von den verwendeten Werten ab, so dass die Werte hier eher als Richtwerte betrachtet werden müssen. a, b, c sind immer vom gleichem Datentyp. Die verwendete Funktion gibt an, ob durch den Compiler eine vordefinierte Funktion aufgerufen wurde, oder aber direkter Assembler Code generiert wurde (Inline). Ersteres ist platzsparender, wenn die Verwendung mehrfach im Programm geschieht und der Code für die Berechnung relativ lang ist, letzteres gibt dem Compiler hingegen mehr Möglichkeiten für Optimierungen. Die Bits sind sizeof(datentyp)*8.
Die Assemblerausgabe des Benchmark-Programms lässt sich mit
generieren. Beim Compilieren ist es ferner wichtig, dass die vollständige printf Funktionen verwendet werden, sonst werden bei den double Berechnungen nur '?' als Ergebnis angezeigt. An den gezählten Ticks ändert dies jedoch nichts. Siehe hierzu auch [1]
[Bearbeiten] Weblinks |