Ich habe kürzlich angefangen, über Benchmarks zu lesen und sie für Android (in Java) zu schreiben. Mir sind solche Probleme wie Warmups, Garbage Collector und Compiler-Optimierungen bekannt, aber ich weiß nicht, ob das Problem, auf das ich stoße, von einem dieser Probleme verursacht werden könnte.
In meiner Benchmark-App erstelle ich ein Array von 10.000 Float-Variablen und initialisiere es mit zufälligen Werten. Beim Ausführen des Benchmark-Codes:
%Vor%auf meinem Handy bekomme ich ca. 2 Sekunden zum Aufwärmen und 20 Sekunden für "echte" Schleife.
Wenn ich nun zwei weitere float-Variablen (sum2 und sum3 - die niemals in der Methode verwendet werden) hinzufüge:
%Vor%Ausführungszeit springt von 2 Sekunden für Warmup auf 5 Sekunden und von 20 Sekunden für echte Schleife auf 50 Sekunden.
Die Konstanten:
%Vor%Glauben Sie, dass ein solcher Unterschied durch Ausrichtungsprobleme verursacht werden könnte (nur eine lose Idee)?
Vielen Dank im Voraus für die Antworten.
BEARBEITEN:
Dieser Fehler scheint nicht auf allen Geräten zu erscheinen. Ich kann es auf dem Samsung Galaxy S5 reproduzieren. Das Hauptziel des Programms bestand darin, wenig Benchmark zu setzen. Ich habe vier fast identische Funktionen (runMinorBenchmark
Ich weigere mich zu glauben, dass das der Grund für Ihre Probleme ist. Sicher, der Compiler schmeißt die ungenutzten Variablen einfach weg? Sind Sie sicher, dass sich das Eingabearray nicht ändert oder Ihre Konstanten oder TAB_SIZE
?
Wenn Sie sich immer noch sicher sind, beweisen Sie es, indem Sie so etwas ausführen und die Ausgabe hier einfügen:
%Vor%%Vor%Wenn ich nun zwei weitere float-Variablen (sum2 und sum3 - die niemals in der Methode verwendet werden) hinzufüge:
Aber sum2
und sum3
sind innerhalb der Methode verwendet. Sie werden auf Null initialisiert. Das kostet Zeit.
Wenn sie nicht initialisiert wurden, wäre der generierte Byte-Code identisch mit und ohne sie, abgesehen von der Größe des zugewiesenen Stack-Frames, was das Timing nicht beeinflusst.
Tags und Links java android performance-testing