Ich bin ein Schaltungsentwickler (kein Softwareassistent) und habe in den letzten 9 Monaten an einem numerischen Algorithmus gearbeitet. Als eine Möglichkeit, die Effektivität meiner Algorithmen zu bewerten, überwache ich die Zeit, die benötigt wird, um zu einer Lösung zu konvergieren.Wie kann sich meine Variablendeklaration auf die Ausführungszeit auswirken?
Vor etwa 6 Monaten entdeckte ich, dass die Art, wie ich meine Variablen deklariere, dramatische Auswirkungen auf die Zeit haben kann, die das Programm benötigt. Wenn Sie beispielsweise die Deklarationen einfach neu anordnen (siehe unten), können Sie die für die Ausführung des Codes benötigte Zeit verdoppeln. Das Ändern der Längen der Arrays wirkt sich in ähnlicher Weise auf das Problem aus.
int N, j, Iter;
long double RealZero, RealErr, QuadIterErr, QuadX;
long double TUV[3], QuadQP[102], RealQP[102];
bool Updated;
int N, j, Iter;
long double RealZero, RealErr, QuadIterErr, QuadX;
long double QuadQP[102], RealQP[102];
bool Updated;
long double TUV[3];
Ich nahm zunächst an, dass ich eine Art von Bug hatte, aber ich kann es nicht finden. Abgesehen von der Geschwindigkeit sehe ich keine anderen Anomalien, und ich bekomme die gleichen Ergebnisse, egal ob der Code langsam oder schnell läuft.
Ich fand einige Diskussionen über Probleme im Zusammenhang mit langen Doppelpackungen, aber ich verstand nichts davon, und sie sagten nie, wie man das Problem, das sie diskutierten, behob.
Kann mir jemand einen Einblick geben, was hier vor sich geht und wie man es beheben kann?
Ich brauche Konsistenz mehr als ich brauche die Geschwindigkeit. Ich verwende keine Geschwindigkeitsoptimierer (Standardeinstellungen für den Compiler) und verwende C++ Builder XE3. Ich benutze kein #pragma-Paket (wie jemand gefragt hat).
Basierend auf den Kommentaren habe ich die Deklarationen für langsame und schnelle Ausführung eingerichtet und die Basisadressen für alle langen Doppelvariablen verglichen. Ob langsam oder schnell enden die Adressen mit einem 0, 4, 8 oder C.
Ich würde Cache-Shenanigans erraten, aber ich würde auch vermuten, dass ein optimierender Compiler die Deklarationen sowieso neu anordnen würde. Mit "Speed Optimizers" meinst du, du sagst dem Compiler, er solle gar nicht optimieren? – awksp
Oh, und welche Längenänderungen hast du gemacht? – awksp
In Bezug auf Optimierer, ich meine, dass ich einfach die Standard-Compiler-Einstellungen verwende. Ich kann jede der Array-Längen ändern und die Geschwindigkeit beeinflussen, oder ich kann Dummy-Variablen hinzufügen, um die Geschwindigkeit zu beeinflussen. –