对于算法的计时(大约以ms为单位),这两种方法中的哪一种更好:
clock_t start = clock();
algorithm();
clock_t end = clock();
double time = (double) (end-start) / CLOCKS_PER_SEC * 1000.0;
Run Code Online (Sandbox Code Playgroud)
要么,
time_t start = time(0);
algorithm();
time_t end = time(0);
double time = difftime(end, start) * 1000.0;
Run Code Online (Sandbox Code Playgroud)
另外,根据Freenode的C++频道中的一些讨论,我知道时钟的分辨率非常差,因此(相对)快速算法的时序将为零.但是,哪个有更好的分辨率time()或clock()?还是一样吗?
Rap*_*ptz 47
<chrono> 如果您正在使用C++ 11,那将是一个更好的库.
#include <iostream>
#include <chrono>
#include <thread>
void f()
{
std::this_thread::sleep_for(std::chrono::seconds(1));
}
int main()
{
auto t1 = std::chrono::high_resolution_clock::now();
f();
auto t2 = std::chrono::high_resolution_clock::now();
std::cout << "f() took "
<< std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count()
<< " milliseconds\n";
}
Run Code Online (Sandbox Code Playgroud)
从这里取的例子.
Dav*_*son 43
这取决于您的需求:time测量实际时间,同时clock测量当前过程所需的处理时间.如果您的进程在任何可观的时间内休眠,或者系统正在忙于其他进程,那么这两者将会非常不同.
http://en.cppreference.com/w/cpp/chrono/c/clock
time_t结构可能是一个整数,这意味着它的分辨率为秒.
第一段代码:它只计算CPU执行某些操作的时间,所以当你执行sleep()时,它不计算任何内容.它可以通过计算你睡觉的时间来绕过(),但它可能会在一段时间后开始漂移.
第二部分:只有秒的分辨率,如果你需要亚秒级的时间读数,那就不那么好了.
对于具有最佳分辨率的时间读数,您应该执行以下操作:
double getUnixTime(void)
{
struct timespec tv;
if(clock_gettime(CLOCK_REALTIME, &tv) != 0) return 0;
return (tv.tv_sec + (tv.tv_nsec / 1000000000.0));
}
double start_time = getUnixTime();
double stop_time, difference;
doYourStuff();
stop_time = getUnixTime();
difference = stop_time - start_time;
Run Code Online (Sandbox Code Playgroud)
在大多数系统上,它的分辨率将降至几微秒,但它可能随着不同的CPU而变化,甚至可能是主要的内核版本.