普通的单线程 *nix 程序可以使用 time
等实用程序进行基准测试,即:
# how long does `seq` take to count to 100,000,000
/usr/bin/time seq 100000000 > /dev/null
输出:
1.16user 0.06system 0:01.23elapsed 100%CPU (0avgtext+0avgdata 1944maxresident)k
0inputs+0outputs (0major+80minor)pagefaults 0swaps
...但返回的数字始终取决于系统,从某种意义上说,这也衡量了用户的硬件。
是否有一些非相关基准测试方法或命令行实用程序可以在任何 系统(或至少相当大的系统子集)上返回大致相同的虚拟时序数?就像 grep -m1 bogo/proc/cpuinfo
返回 a roughly approximate but stable unit ,这样的基准也应该返回一个有点相似的持续时间单位。
假设要对普通命令进行基准测试,我们有一个神奇的工具 bogobench
(其中“bogo”是一个形容词,表示“有些虚假状态” ,但不一定具有与 BogoMIPs 相同的算法):
bogobench foo bar.data
我们在两个物理上独立的系统上运行它:
- 1996 年 奔腾 II
- 2015 Xeon
期望的输出是这样的:
21 bogo-seconds
所以 bogobench
应该在两种情况下返回大致相同的数字,即使在第二个系统上它可能会在更短的时间内完成。
像 qemu
这样的硬件模拟器可能是一种方法,但不一定是唯一的方法:
- 将要进行基准测试的代码插入包装脚本
bogo.sh
- 将
bogo.sh
复制到一个可引导的 Linux 磁盘镜像 bootimage.iso,在bogo.sh
将自动运行然后立即关闭的目录中模拟器。在此期间,它会输出某种形式的计时数据以解析为 bogo-seconds。 使用
qemu
的最小-machine
选项之一运行bootimage.iso:qemu-system-i386 -machine type=isapc bootimage.iso
但我不确定如何让 qemu
使用虚拟时钟,而不是主机 CPU 的时钟,而且 qemu
本身似乎是一个看似笨重的工具简单的任务。 (对于这样的任务, MAME 或 MESS 是比 qemu
更通用的模拟器——但我不擅长MAME,尽管 MAME currently has some capacity for 80486 PC emulation .)
在网上,我们有时会比较和对比在机器 X 上制作的基于时间的基准测试与在机器 Y 上制作的基准测试。而我希望用户 X 和 Y 能够在虚拟机器 Z 上进行基准测试,并获得模拟 < em>X 或 Y(如 MAME),除非不考虑 X 或 Y 的真实运行时间(不同于 MAME,其中仿真通常可以播放)。通过这种方式,用户可以报告程序在有趣的情况下如何执行,而程序员不必担心结果会因用户硬件的特性而产生偏差,例如 CPU 怪癖、后台进程占用资源等。
事实上,即使在用户自己的硬件上,基于时间
的基准测试也可能不可靠,因为用户通常无法确定某些后台进程(或错误,或硬件错误,如坏扇区或病毒),可能不会降低性能的某些方面。而更虚拟的基准应该不太容易受到这种影响。
最佳答案
我认为实现这一点的唯一明智的方法是为某种硬件设计使用周期精确的模拟器。
AFAIK,不存在用于现代 x86 硬件的公开可用的周期精确模拟器,因为它非常复杂,尽管有很多关于 x86 微体系结构内部结构的知识( Agner Fog 的东西,英特尔和 AMD 自己的优化指南,和 x86 标签 wiki 中的其他内容),足够多的行为仍然是一个充满 CPU 设计商业 secret 的黑匣子,最多只能模拟类似的东西。 (例如,分支预测绝对是最隐秘但非常重要的部分之一)。
虽然应该有可能接近模拟 Intel Sandybridge 或 Haswell 的实际流水线和无序核心/ROB/RS(比实时慢得多),但据我所知还没有人这样做过。
但针对其他硬件设计的周期精确模拟器确实存在:Donald Knuth's MMIX architecture是一个干净的 RISC 设计,实际上可以用硅构建,但目前只存在于纸上。
来自该链接:
Of particular interest is the MMMIX meta-simulator, which is able to do dynamic scheduling of a complex pipeline, allowing superscalar execution with any number of functional units and with many varieties of caching and branch prediction, etc., including a detailed implementation of both hard and soft interrupts.
因此,您可以将其用作每个人运行基准测试的引用机,每个人都可以获得可比较的结果,这些结果将告诉您某些东西在 MMIX 上的运行速度(在使用 gcc 为 MMIX 编译之后)。但不是它在 x86 上运行的速度有多快(大概也用 gcc 编译),即使对于以不同方式执行相同工作的两个程序来说,这也可能存在很大差异。
对于编程难题和 Code Golf 网站上的[fastest-code]
挑战,@orlp created the GOLF architecture with a simulator that prints timing results ,正是为此目的而设计的。这是一个玩具架构,通过存储到 0xffffffffffffffff
来打印到标准输出,因此它不一定会告诉您任何关于某些东西在任何真实硬件上运行速度的信息。
据我所知,GOLF 没有完整的 C 实现,因此您只能将其与手写的 asm 一起使用。这与 MMIX 有很大的不同,后者是优化编译器的目标。
关于linux - 是否有标准常量 *nix 基准,如果没有,如何制作 `bogobench` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40431736/