0

clock()Macの特定の状況で、ctimeライブラリのメソッドから何か有用なものを取得するのに問題があります。具体的には、VMWareFusionまたはBootCampのいずれかでWindows7でVS2010を実行しようとすると、常に同じ値が返されるように見えます。問題をテストするためのいくつかのテストコード:

#include <time.h>
#include "iostream"

using namespace std;

// Calculate the factorial of n recursively.
unsigned long long recursiveFactorial(int n) {
    // Define the base case.
    if (n == 1) {
        return n;
    }

    // To handle other cases, call self recursively.
    else {
        return (n * recursiveFactorial(n - 1));
    }
}

int main() {
    int n = 60;
    unsigned long long result;
    clock_t start, stop;

    // Mark the start time.
    start = clock();

    // Calculate the factorial of n;
    result = recursiveFactorial(n);

    // Mark the end time.
    stop = clock();

    // Output the result of the factorial and the elapsed time.
    cout << "The factorial of " << n << " is " << result << endl;
    cout << "The calculation took " << ((double) (stop - start) / CLOCKS_PER_SEC) << " seconds." << endl;

    return 0;
}

Xcode 4.3.3では、関数は約2μsで実行されます。

Windows7仮想マシン(VMWare Fusion 4.1.3)のVisual Studio 2010では、同じコードで実行時間が0になります。このマシンには、Macの4コアのうち2つと2GBのRAMが搭載されています。

Windows7を実行しているBootCampでは、実行時間が0になります。

これは「金属から遠すぎる」という問題ですか?

4

2 に答える 2

0

仮想マシンでは、タイマーの解像度がそれほど高くない可能性があります。コンパイラーは、末尾再帰をループに簡単に変換できます。60回の乗算はそれほど長い時間がかかる傾向はありません。フィボナッチ数(もちろん再帰的に)のように、かなりコストのかかるものを計算してみてください。タイマーが作動するはずです。

于 2012-07-17T00:48:06.807 に答える
-1

MSVCに含まれているtime.hから、

#define CLOCKS_PER_SEC  1000

つまりclock()、Visual C ++ランタイムライブラリを使用する場合の解像度は1ミリ秒しかないため、それよりも短い操作のセットは、ほとんどの場合、経過時間がゼロであると測定されます。

役立つWindowsの高解像度タイミングについては、QueryPerformanceCounterこのサンプルコードを確認してください。

于 2012-07-17T00:49:38.587 に答える