现在,我加载文件然后使用gettimeofday的和跟踪的CPU时间与tv_usec

我的结果而变化,我得到250对280S但有时300的或500的。我写了usleep和睡眠(0)和(1)没有成功。时间还大大不同。我想睡觉(1)(秒在Linux中,不是在MS Windows的睡眠)会解决它。我怎么可以跟踪时间进行测试更一致的方式吗?也许我应该开始测量之前等待,直到我有一个大得多的测试数据和更复杂的代码?

有帮助吗?

解决方案

为高解析度时间在Linux(和POSIX一般)当前推荐的接口是clock_gettime。参见手册页。


clock_gettime(CLOCK_REALTIME, struct timespec *tp) //  for wall-clock time
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, struct timespec *tp) //  for CPU time

但阅读手册页。请注意,您需要-lrt链接,因为POSIX是这么说的,我猜。也许,以避免在-lc符号冲突,对于定义自己clock_gettime旧的程序?但动态库使用弱符号......

的最佳睡眠功能是了nanosleep。它周围不乱用信号或类似usleep任何废话。它被定义为只是睡觉,没有任何其他的副作用。它会告诉你,如果你早早起来(例如,来自信号),所以你不必调用另一个时间功能。

不管怎样,你将有一个很难测试的东西一个代表短,涉及的系统调用。有一个巨大的变化机会的数量。例如调度可以决定一些其他的工作需要做的(不太可能,如果你的进程才刚刚开始,你会不会有用不完的时间片)。 CPU高速缓冲存储器(L2和TLB)是容易可行的。

如果你有一个多核心机和你优化的代码单线程基准,你可以把它别在你的核心的一个实时优先级。确保你选择的是不处理中断,或者您的键盘(和其他一切)将被锁定,直到它完成的核心。使用taskset的(用于钉扎到一个CPU)和CHRT(用于设置实时PRIO)。 看到这个邮件我送到GMP-devel的这一招: http://gmplib.org/list-archives/gmp- devel的/ 2008三月/ 000789.html

噢,为最精确的定时,可以RDTSC自己使用(在x86 / AMD64)。如果你没有在你钳工什么其他的系统调用,它不是一个坏主意。抓住一个基准框架把你的功能之中。 GMP有一个相当不错的一个。它也许不是设置好为基准不在GMP的功能,并呼吁mpn_whatever,虽然。我不记得,这是值得一试。

其他提示

您试图测量它需要多长时间来加载一个文件?通常,如果你是性能测试的代码,已经是相当快的(亚秒)的一些位,那么你将要重复相同的代码多次(比如千或万美元),时间一大堆,然后通过迭代次数除以的总时间。

说到这里,我不是很确定你所使用的睡眠()进行。你可以发布你打算做什么的例子?

我建议把该代码在一个for循环。超过1000或10000次迭代运行它。有问题,这一点,如果你正在做的只是几个指令,但它应该帮助。

当然

更大的数据集也帮助。

睡眠将会从CPU取消调度您的线程。它不准确计数的时间与精确度。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top