我正试图找出一种编写一些代码的方法,这些代码可以准确地计算出在BST上执行搜索所需的时间。目前即时使用时间和元素总数的顺序为10 ^ 5。它看起来如下: -
clock_t begin, end;
begin = clock();
...
...
...
end = clock();
difference = (end-begin)/CLOCKS_PER_SECOND;
然而,这并没有给我提供我正在寻找的精确度。我可以使用其他任何libc函数吗?
答案 0 :(得分:2)
要对您的算法进行基准测试,您需要进行一些重复以达到至少几百毫秒的范围。 (这是标准做法)。要仅对用户空间中发生的算法进行基准测试(无线程,系统调用等),您需要使用getrusage(RUSAGE_SELF, &r)
并使用包含秒和微秒的r.ru_utime
值。
答案 1 :(得分:2)
如果您的库支持它,C11的timespec_get()
最长可达纳秒,具体取决于您的系统时钟分辨率。
答案 2 :(得分:1)
如果您使用Intel CPU运行基准测试。也许您可以尝试RDTSC和RDTSCP指令。
答案 3 :(得分:0)
BST?你想要什么样的精度?在32位系统上将CLOCKS_PER_SECOND除以10 ^ 6应该得到6位数的精度?
你是否将结果转换为双倍?
尝试
difference = (double)(end-begin)/CLOCKS_PER_SECOND;
请注意,差异应该能够保持双倍。
答案 4 :(得分:0)
Qt有QElapsedTimer
,支持测量高达纳秒。我无法证明它是多么准确,IIRC它在不同的平台上使用不同的实现。可悲的是它是C ++,可能不适合你。也:
在不提供纳秒分辨率的平台上,值 返回将是可用的最佳估计。
clock()
功能适用于粗略测量,但它可以在毫秒范围内工作。与其名称相反,我不认为它在CPU时钟中测量,因为现代处理器的时钟频率可能会有很大差异,因此无法仅依靠CPU时钟准确地确定实际时间。 IMO这个概念可以追溯到CPU频率不变的时代,没有电源管理,没有“turbo boost”自动超频或者无论如何。
编辑:也找到了这个(time.h):
int clock_gettime(clockid_t clk_id, struct timespec *tp);
... and the target struct...
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
... and the clock options...
CLOCK_REALTIME
System-wide realtime clock. Setting this clock requires appropriate privileges.
CLOCK_MONOTONIC
Clock that cannot be set and represents monotonic time since some unspecified starting point.
CLOCK_PROCESS_CPUTIME_ID
High-resolution per-process timer from the CPU.
CLOCK_THREAD_CPUTIME_ID
Thread-specific CPU-time clock.
答案 5 :(得分:0)
你所做的与我最近做的非常相似。
我认为int gettimeofday(struct timeval *tv, struct timezone *tz);
功能适合您的需要。时间信息将被放入struct timeval tv
,它以秒和微秒获得时间。手册页中的struct timeval
:
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
使用gettimeofday
进行时间测量的简短示例:
struct timeval time;
if(gettimeofday( &time, 0 )) return -1;
long cur_time = 1000000 * time.tv_sec + time.tv_usec;
double sec = cur_time / 1000000.0;
较长的示例已经简化并轻松包装为c ++类以方便使用。代码已放在我的github上:https://github.com/lulyon/LinuxTimeCounter,它在真实世界的项目中使用。