【发布时间】:2017-03-18 19:44:21
【问题描述】:
普通的单线程*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 至强
所需的输出类似于:
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 都能够在虚拟 machine Z 上进行基准测试,并获得奖励积分来模拟 X 或 Y(如 MAME)如果需要,除非不考虑 X 或 Y 的真实运行时间,(与 MAME 不同,其中仿真通常可以播放)。通过这种方式,用户可以报告程序在有趣的情况下的执行情况,而程序员不必担心结果会因用户硬件的特性而产生偏差,例如 CPU 怪癖、后台进程占用资源等。
确实,即使在用户自己的硬件上,基于time 的基准测试也可能不可靠,因为用户通常无法确定某些后台进程(或错误或硬件错误,例如坏扇区或病毒)可能不会降低性能的某些方面。而更虚拟的基准应该不太容易受到这种影响。
【问题讨论】:
-
没有。你想测量什么?基准是无限可替代的;跨机器的结果很少具有可比性。您的测试假设有多少 CPU?机器上有多少内存?测试使用了多少内存?机器上有多少磁盘?它有多快?它有多固态?测试运行时还发生了什么?等等等等。恐怕问题是,太宽泛了,不适合 SO。
-
啊,standards.
-
@shellter,我稍微调整了 OP。这样一个 util 的价值是如此普遍,以至于它就像要求
bc的特定用途一样。一种非常规的用法可能被称为反向基准测试,其中系统Y可以尝试计算一个合理的良好估计值(实时) util 需要在 system X 上运行。 -
@PeterCordes,感谢您的反馈和投票——我想要一个相当近似但不一定完美的非主观命令行基准工具。 如何它可能工作是次要的。 emulator/simulator 想法是一种方法,但认为它是唯一 可能的方法似乎还为时过早——我将 emulators 更多地称为“ brute force”方法来证明它在技术上并非不可能。同意 模拟 可能不完美,但这并不意味着它完全无用或无法改进。
-
编译器优化不相关,因为它与错误的抽象级别有关——要消除这个级别,只需假设
foo包括将寄存器递增 100000000 次,即假设foo可证明不受编译器优化的影响。所以bogobench会测量那个级别的代码。 任何代码可能被优化(无论是手动还是编译器——最终都是手动完成的,因为人类编写编译器)这一事实并不相关。
标签: linux time emulation benchmarking qemu