【发布时间】:2014-04-05 10:33:14
【问题描述】:
是否有可能在 Java 中的 System.currentTimeMillis() 之类的 C++ 程序中获得实际的毫秒,因为我不知道?我知道time(),但我认为它不足以测量短时间,是吗?
【问题讨论】:
-
@slugonamission: 那是 *nix 特定的...
-
@LaszloPapp - 糟糕,已删除。
是否有可能在 Java 中的 System.currentTimeMillis() 之类的 C++ 程序中获得实际的毫秒,因为我不知道?我知道time(),但我认为它不足以测量短时间,是吗?
【问题讨论】:
如今(几年后)它已成为语言标准的一部分:
#include <chrono>
#include <iostream>
int main()
{
using namespace std::chrono;
auto epoch = high_resolution_clock::from_time_t(0);
// ...
auto now = high_resolution_clock::now();
auto mseconds = duration_cast<milliseconds>(now - epoch).count();
std::cout << "millis: " << mseconds;
}
【讨论】:
using namespace std::chrono; 在这里看起来很值得。
在 C++ 中,您也有 clock()
#include <time.h>
...
clock_t start = clock();
... some processing ...
clock_t stop = clock();
double elapsed = double(stop - start) / CLOCKS_PER_SEC;
还有其他更准确的计时方法,但它们更多地取决于您在哪个系统中运行程序。
【讨论】:
clock 函数返回 CPU 时间。我觉得这是在询问墙上时间。
CLOCKS_PER_SEC 的值取决于系统,提供的精度也是如此(它们不需要对齐;例如CLOCKS_PER_SEC 可能是100000,但精度只是20 毫秒)。
如果您有可用的 C++11 支持,您可能需要查看std::chrono。
#include <iostream>
#include <chrono>
#include <ctime>
long fibonacci(int n)
{
if (n < 3) return 1;
return fibonacci(n-1) + fibonacci(n-2);
}
int main()
{
std::chrono::time_point<std::chrono::system_clock> start, end;
start = std::chrono::system_clock::now();
std::cout << "f(42) = " << fibonacci(42) << '\n';
end = std::chrono::system_clock::now();
std::chrono::duration<double> elapsed_seconds = end-start;
std::time_t end_time = std::chrono::system_clock::to_time_t(end);
std::cout << "finished computation at " << std::ctime(&end_time)
<< "elapsed time: " << elapsed_seconds.count() << "s\n";
}
如果做不到这一点,你可以使用 C 风格的 std::time 如下:
#include <ctime>
#include <iostream>
int main()
{
std::time_t result = std::time(NULL);
std::cout << std::asctime(std::localtime(&result))
<< result << " seconds since the Epoch\n";
}
【讨论】: