何らかの理由で、私のコードは整数よりも倍精度でスワップを実行できます。なぜこれが起こるのか私にはわかりません。
私のマシンでは、ダブル スワップ ループは整数スワップ ループよりも 11 倍速く完了します。double/integer のどのプロパティが、このように実行するのですか?
テスト設定
- Visual Studio 2012 x64
- CPU コア i7 950
- Release としてビルドし、exe を直接実行します。VS Debug フックは物事をゆがめます
出力:
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;
}
Blastfurnace が説明したように、VS はループの 1 つだけを最適化したようです。
すべてのコンパイラの最適化を無効にして、スワップ コードをループ内にインライン化すると、次の結果が得られました (タイマーも std::chrono::high_resolution_clock に切り替えました)。
Process time for ints 1449 ms
Process time for doubles 1248 ms