gpt4 book ai didi

performance - 对受 CPU 限制的算法/实现进行基准测试

转载 作者:行者123 更新时间:2023-12-03 07:44:19 25 4
gpt4 key购买 nike

假设我正在用编译语言(例如 C++)编写自己的 StringBuilder

衡量各种实现的性能的最佳方法是什么?简单地对几十万次运行进行计时会产生高度不一致的结果:一批与另一批的计时可能相差高达 15%,因此无法准确评估潜在的性能改进,从而产生小于此的性能增益。

我已完成以下操作:

  1. 禁用 SpeedStep
  2. 使用 RDTSC 进行计时
  3. 以实时优先级运行进程
  4. 设置与单个 CPU 核心的亲和性

这在一定程度上稳定了结果。还有其他想法吗?

最佳答案

我通过这种方式取得了 100% 一致的结果:

  1. 使用 MS-DOS 设置 Bochs。
  2. 设置您的工具链以瞄准 MS-DOS
    - 或者 -
    1. 设置工具链以面向 32 位 Windows
    2. 安装HX-DOS extender在博克斯。
    3. 如有必要,破解工具包的标准库/运行时并 stub /删除需要 Windows API 的功能(未在 HX-DOS 中实现)。当您尝试运行该程序时,扩展程序将打印未实现的 API 列表。
  3. 将基准测试中的周期数减少几个数量级。
  4. 使用汇编器 cli/sti 指令封装基准代码(请注意,进行此更改后,二进制文件将无法在现代操作系统上运行)。
  5. 如果您还没有这样做,请让您的基准测试使用 rdtsc 增量进行计时。示例应位于 clisti 指令内。
  6. 在 Bochs 中运行它!

Bochs screenshot

结果似乎是完全确定性的,但并不是对整体性能的准确评估(有关详细信息,请参阅 Osman Turan 的答案下的讨论)。

<小时/>

作为额外提示,这里有一种与 Bochs 共享文件的简单方法(这样您就不必每次都卸载/重建/重新安装软盘镜像):

在 Windows 上,Bochs 将锁定软盘镜像文件,但该文件仍以共享写入模式打开。这意味着您无法覆盖该文件,但可以对其进行写入。 (我认为 *nix 操作系统可能会导致覆盖创建新文件,就文件描述符而言。)诀窍是使用 dd 。我设置了以下批处理脚本:

... benchmark build commands here ...
copy /Y C:\Path\To\Benchmark\Project\test2dos.exe floppy\test2.exe
bfi -t=288 -f=floppysrc.img floppy
dd if=floppysrc.img of=floppy.img

bfi 是 Bart 的 Build Floppy Image .

然后,只需在 Bochs 中挂载 floppy.img 即可。

<小时/>

额外提示#2:为了避免每次在 Bochs 中手动启动基准测试,请将一个空的 go.txt 文件放入软盘目录中,然后在 Bochs 中运行此批处理:

@echo off
A:
:loop
choice /T:y,1 > nul
if not exist go.txt goto loop
del go.txt
echo ---------------------------------------------------
test2
goto loop

每次检测到新的软盘镜像时,它都会启动测试程序。这样,您就可以在单个脚本中自动运行基准测试。

<小时/>

更新:这个方法不太可靠。有时,仅通过重新排序一些测试,计时就会改变多达 200%(使用原始问题中描述的方法在真实硬件上运行时,不会观察到这些计时变化)。

关于performance - 对受 CPU 限制的算法/实现进行基准测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8628733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com