我试图找出一种方法来编写一些代码,该代码可以准确地计算出在 BST 上执行搜索所需的时间。目前我正在使用时间,元素总数为 10^5。它看起来像下面这样:-
clock_t begin, end;
begin = clock();
...
...
...
end = clock();
difference = (end-begin)/CLOCKS_PER_SECOND;
但是,这并没有给我我正在寻找的精度。还有其他我可以使用的 libc 函数吗?
如果您的库支持它,C11timespec_get()
可以测量到纳秒,具体取决于您的系统时钟分辨率。
如果您使用 Intel CPU 运行基准测试。也许你可以试试 RDTSC 和 RDTSCP 指令。
要对您的算法进行基准测试,您需要进行一些重复以进入至少数百毫秒的范围。(这是标准做法)。要对仅在用户空间中发生的算法(无线程、系统调用等)进行基准测试,您需要使用getrusage(RUSAGE_SELF, &r)
包含r.ru_utime
秒和微秒的值。
你所做的与我最近所做的非常相似。
我确实认为该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 ,用于实际项目。
QtQElapsedTimer
支持高达纳秒的测量。我无法证明它有多准确,IIRC 它在不同平台上使用不同的实现。可悲的是它是 C++,它可能不适合你。还:
在不提供纳秒分辨率的平台上,返回的值将是可用的最佳估计值。
该clock()
功能适用于粗略测量,但它在毫秒范围内有效。与它的名字相反,我不认为它以 CPU 时钟为单位进行测量,因为现代处理器的时钟频率可能会有很大差异,因此无法仅依靠 CPU 时钟准确地确定实际时间。IMO 这个概念可以追溯到 CPU 频率恒定、没有电源管理、没有“涡轮增压”自动超频或其他任何东西的时代。
编辑:还发现了这个(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.
英国夏令时?你想要什么样的精度?在 32 位系统上除以 CLOCKS_PER_SECOND 为 10^6 应该得到 6 位精度?
你把结果加倍吗?
尝试
difference = (double)(end-begin)/CLOCKS_PER_SECOND;
请注意,差异应该能够保持双倍。