Performance Optimierung
-
do { res = div((int)zTest, (int)pz[ind++]); //++ind; }while(res.rem != 0 && pz[ind] < res.quot && ind <= max_ind);
und
if(res.rem) { //++max_ind; pz[++max_ind] = zTest; }
Keine Extra-Anweisung für das Inkrement bringt tatsächlich noch mal eine Kleinigkeit, die sich bei einem größeren zu testenden Bereich sicher signifikant bemerkbar macht.
-
#include <ctime> #include <iostream> #include <algorithm> int main() { std::clock_t start = std::clock(); unsigned int counter = 1; std::size_t const maxCount = 900000; bool* prims = new bool[maxCount]; std::fill_n(prims, maxCount, true); for(std::size_t i = 2; i < maxCount; ++i) { if(prims[i]) { ++counter; for(std::size_t r = i + i; r < maxCount; r += i) { prims[r] = false; } } } std::cout << (std::clock() - start) << "ms" << std::endl; std::cout << counter << std::endl; /*for(std::vector<bool>::size_type i = 1; i < primVec.size(); ++i) { if(primVec[i]) { std::cout << i << ", "; } }*/ delete[] prims; return 0; }
MSVC volle Optimierung auf Geschwindigkeit: 0 - 16ms.
std::clock
reicht da nicht mehr aus, hat eine zu schlechte AuflösungGCC habe ich auf diesem Computer nicht, daher kann ich es nur mit dem MSVC testen.
Edit: Einen Header vergessen. Und die Ausgabe sollte man vielleicht noch anpassen (das im Kommentar).
Grüssli
-
In meinem Code ist ein gemeiner Fehler:
Die Variable ind muß bei der Definition mit 0 initialisiert werden, die Initialisierung im Schleifenkopf greift erst nach dem ersten Schleifendurchlauf. Dann klappts auch mit den Optimierungsschaltern. Damit komm ich auf 17 Sekunden bei einem Testbereich von 10.000.000 (Das Array pz muß dann 1.000.000 Elemente haben, die auf dem Heap angelegt werden müssen).@Dravere:
Morgen abend könnte ich auch mal den MS-Compiler nutzen, welche Schalter kann ich dort auf der Kommandozeile dem cl.exe für Optimierung mitgeben?
-
Belli schrieb:
@Dravere:
Morgen abend könnte ich auch mal den MS-Compiler nutzen, welche Schalter kann ich dort auf der Kommandozeile dem cl.exe für Optimierung mitgeben?Da bin ich überfragt. Ich benutze die IDE Visual Studio, die macht mir die Schalter automatisch. Kenne die nicht auswendig ...
Aber ich denke mal wichtig sind die folgenden drei:
/O2 /Ot /GL/O2 -> Maximize Speed
/Ot -> Favor Fast Code
/GL -> Enable link-time code generationGrüssli