Aus irgendeinem Grund ist mein Code in der Lage, Swaps auf Doppel schneller als auf den ganzen Zahlen durchzuführen. Ich habe keine Ahnung, warum das passieren würde.Performance Swaping ganze Zahlen vs Doppel
Auf meinem Computer ist die doppelte Swap-Schleife 11-mal schneller als die Integer-Swap-Schleife. Welche Eigenschaft von Double/Integer macht sie so?
Testaufbau
- Visual Studio 2012 x64
- CPU Core i7 950
- Bauen als Release und laufen exe direkt, VS Debug Haken Skew Dinge
Ausgabe:
Process time for ints 1.438 secs
Process time for doubles 0.125 secs
#include <iostream>
#include <ctime>
using namespace std;
#define N 2000000000
void swap_i(int *x, int *y) {
int tmp = *x;
*x = *y;
*y = tmp;
}
void swap_d(double *x, double *y) {
double tmp = *x;
*x = *y;
*y = tmp;
}
int main() {
int a = 1, b = 2;
double d = 1.0, e = 2.0, iTime, dTime;
clock_t c0, c1;
// Time int swaps
c0 = clock();
for (int i = 0; i < N; i++) {
swap_i(&a, &b);
}
c1 = clock();
iTime = (double)(c1-c0)/CLOCKS_PER_SEC;
// Time double swaps
c0 = clock();
for (int i = 0; i < N; i++) {
swap_d(&d, &e);
}
c1 = clock();
dTime = (double)(c1-c0)/CLOCKS_PER_SEC;
cout << "Process time for ints " << iTime << " secs" << endl;
cout << "Process time for doubles " << dTime << " secs" << endl;
}
Es scheint, dass VS nur eine der Schleifen optimiert wie Hütten erläutert.
Wenn ich alle Compiler-Optimierungen zu deaktivieren und in den Schleifen meinen Swap-Code inline habe, habe ich die folgenden Ergebnisse (Ich wechselte auch meine Timer std :: Chrono :: high_resolution_clock):
Process time for ints 1449 ms
Process time for doubles 1248 ms
Was ist der Ausgang? Ich bin neugierig. Auch 32-Bit-Maschine oder 64-Bit-Maschine? 32-Bit- oder 64-Bit-Code? Compiler? OS? – nneonneo
Wie viele Sekunden sprechen wir für jeden hier? –
Was * ist * deine Maschine? Ich habe Ihr Programm mit ein paar verschiedenen Optimierungen hier ausgeführt, und ich habe nichts erhalten, was Sie sehen. Cache-Verhalten vielleicht? –