2010-07-14 51 views
1

我在秋季学习计算几何课程,我们将在C或C++中实现一些算法并对它们进行基准测试。大多数学生使用time命令生成一些数据集并测量他们的程序,但我希望能够更彻底一些。测量计算几何算法的运行时间

我正在考虑编写一个程序来自动生成不同的数据集,运行我的程序并使用R来测试假设和估计参数。

所以...你如何更准确地测量程序运行时间?

什么可能与衡量有关?

什么样的假设可能会有趣的测试(方差,缓存造成的影响等)?

我应该在多台机器上测试我的代码吗?这些机器应该如何区别?

我的总体目标是了解这些算法在实践中的表现如何,哪些实现技术更好,以及硬件实际执行的方式。

+0

看不到这与C或C++有什么关系。 – 2010-07-14 20:21:33

+2

@Neil Butterworth:OP说算法将用C或C++编写。所以一切都需要基于它。 – 2010-07-14 20:23:52

回答

0

您可以使用Windows API计时功能(并非如此),您可以使用RDTSC内联汇编程序命令,它精确到亚纳秒级别(不要忘记命令及其周围的指令会产生小的开销几百个周期,但这不是一个大问题)。

0

为了与程序,以获得更好的精度指标,你将不得不运行您的程序很多次,比如100或1000

有关详细信息,关于指标,在网络上搜索指标剖析

请注意,由于在后台运行的应用程序(如病毒扫描程序,音乐播放器和其他具有计时器的程序)可能导致程序在性能(时间)测量上存在差异。

你可以在不同的机器上测试你的程序。处理器时钟速率,L1和L2高速缓存大小,RAM大小和磁盘速度都是因素(以及同时运行的其他程序/任务的数量)。浮点也可能是一个因素。

如果需要,您可以通过打印各种优化设置的列表的汇编语言来挑战编译器。查看哪个设置产生最少或最有效的汇编代码。

由于您处理数据,看看数据驱动的设计http://www.gamearchitect.net/Articles/DataDrivenDesign.html

+0

另一个网站(数据驱动的编程):http://ai.eecs.umich.edu/soar/Classes/494/talks/Schumaker.pdf – 2010-07-14 20:34:01

0

您可以使用Windows的高性能计数器以获得精确到纳秒。从技术上讲,afaik,HPC可以是任何速度,但你可以查询它的每秒计数,据我所知,大多数CPU做非常高的性能计数。

你应该做的只是得到一个专业的分析器。这就是他们的目的。然而更现实的一点。

如果你只是在算法之间进行比较,只要你的机器在一个区域(奔腾D,SSD类型的东西)中没有发生擅长的事情,在一台机器上执行它应该没有太大的关系。如果您想查看缓存效果,请在机器启动后立即尝试运行算法(确保您获得Windows 7的副本,对于CS学生应该是免费的),然后让它做一些可能会大量缓存的重量,像图像处理,24小时或者说服操作系统缓存它。然后再次运行算法。比较。

+0

关于架构/机器无关紧要的说法是错误的,每个架构都是因为技术随着时间的推移而有所不同。 声称板凳需要一天缓存“填满”也是错误的,L1/L2缓存填充几个钟/微秒,所以没有必要“让它运行十年”。 – Quonux 2010-07-14 20:34:14

+0

你完全误解了我的帖子。每个架构都不同,但算法不会。如果它的性能比率大致相同,算法的相对性能将保持不变。另外,填充L1/L2缓存可以说服操作系统这样做,而不是让CPU去做。 – Puppy 2010-07-14 22:03:26

+0

操作系统负责填充它自己的文件缓存 - 在主内存中。 L1/L2缓存是CPU的一部分,由它管理。 – 2010-07-15 10:07:12

0

您没有指定您的平台。如果你在POSIX系统上(例如linux)查看clock_gettime。这使您可以访问不同种类的时钟,例如挂钟时间或CPU时间。你也可能知道时钟的精确度。

既然你愿意对你的数字做出很好的统计,你应该经常重复你的实验,以便统计测试给你足够的信心。

如果你的测量结果不是很精细,而且差异很小,那么对于10个探针,这通常是相当不错的。但是,如果你做到小规模,一个简短的功能,你可能需要高得多。你

还必须确保可重复的实验条件下,机,内存不够等

1

廓线仪是伟大上没有其他负载。 Valgrind很受欢迎。另外,如果你可以访问一些,我建议你在risc机器上试用你的代码。它们的性能特征与有趣的方式不同。