1

我将在秋季参加关于计算几何的课程,我们将在 C 或 C++ 中实现一些算法并对其进行基准测试。大多数学生生成一些数据集并使用time命令测量他们的程序,但我想更彻底一点。

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

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

什么可能与测量相关?

哪些假设可能值得测试(方差、缓存造成的影响等)?

我应该在多台机器上测试我的代码吗?这些机器应该有什么不同?

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

4

5 回答 5

1

探查器很棒。Valgrind 很受欢迎。另外,如果您可以访问某些代码,我建议您在 risc 机器上试用您的代码。它们的性能特征以有趣的方式不同于 cisc 机器。

于 2010-07-14T21:39:57.223 回答
0

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

于 2010-07-14T20:28:02.763 回答
0

为了获得更准确的程序指标,您必须多次运行程序,例如 100 或 1000。

有关指标的更多详细信息,请在网络上搜索指标分析

请注意,由于在后台运行的东西(例如病毒扫描程序、音乐播放器和其他带有计时器的程序),程序的性能(时间)测量可能会有所不同。

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

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

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

于 2010-07-14T20:28:12.917 回答
0

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

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

如果您只是在算法之间进行比较,只要您的机器碰巧在一个领域(奔腾 D、SSD 之类的东西)表现出色,那么只在一台机器上做就没有太大关系。如果您想查看缓存效果,请尝试在机器启动后立即运行算法(确保您获得了 Windows 7 的副本,应该对 CS 学生免费),然后让它做一些可能会占用大量缓存的事情,如图像处理,24 小时或说服操作系统缓存它的东西。然后再次运行算法。相比。

于 2010-07-14T20:28:26.973 回答
0

你没有指定你的平台。如果您使用的是 POSIX 系统(例如 linux),请查看clock_gettime. 这使您可以访问不同类型的时钟,例如挂钟时间或 CPU 时间。您还可以了解时钟的精度。

由于您愿意对您的数字进行良好的统计,因此您应该经常重复您的实验,以便统计测试给您足够的信心。

如果您的测量不是太细粒度并且您的方差很低,这通常对于 10 个左右的探针来说非常好。但是如果你缩小到小规模,一个简短的功能左右,你可能需要走得更高。

此外,您还必须确保可重复的实验条件、机器上没有其他负载、足够的可用内存等。

于 2010-07-14T20:58:27.373 回答