0

在我的 Mac 上的特定情况下,我无法从clock()ctime 库中的方法获得任何有用的东西。具体来说,如果我尝试在 Windows 7 中的 VMWare Fusion 或 Boot Camp 下运行 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。

在 Windows 7 虚拟机中的 Visual Studio 2010 下(在 VMWare Fusion 4.1.3 下),相同的代码给出的执行时间为 0;这台机器配备了 Mac 的 4 个内核中的 2 个和 2GB RAM。

在运行 Windows 7 的 Boot Camp 下,执行时间再次为 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 回答