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

2023-12-26

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

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

我做了以下事情:

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

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


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

  1. 使用 MS-DOS 设置 Bochs。
  2. Set up your toolchain to target MS-DOS
    — or —
    1. 设置您的工具链以针对 32 位 Windows
    2. 安装HX-DOS扩展器 http://www.japheth.de/HX.html在博克斯。
    3. 如有必要,破解工具包的标准库/运行时并存根/删除需要未在 HX-DOS 中实现的 Windows API 的功能。当您尝试运行该程序时,扩展程序将打印未实现的 API 列表。
  3. 将基准测试中的周期数减少几个数量级。
  4. 用汇编程序包装基准代码cli / sti说明(请注意,此更改后二进制文件将无法在现代操作系统上运行)。
  5. 如果您还没有,请使用您的基准测试rdtsc时间增量。样品应在clisti指示。
  6. 在 Bochs 中运行它!

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


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

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

... 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是巴特的构建软盘映像 http://www.nu2.nu/bfi/.

然后,只需安装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%(使用原始问题中描述的方法在真实硬件上运行时,不会观察到这些计时变化)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对受 CPU 限制的算法/实现进行基准测试 的相关文章

  • 将 pandas 数据帧拆分为子数据帧列表的最快方法

    我有一个大数据框df我有完整的清单indices中的独特元素df index 我现在想创建一个由元素索引的所有子数据帧的列表indices 具体来说 list df df loc x for x in indices 运行这个命令需要很长时
  • 页面上首次调用 Url.Action 速度很慢

    我有一个相当简单的 ASP MVC 视图的性能问题 这是一个登录页面 应该几乎是即时的 但需要大约半秒钟 经过大量挖掘后 问题似乎出在第一个调用上Url Action 大约需要 450 毫秒 根据迷你分析器 http miniprofile
  • Android 性能:SharedPreferences 的成本

    当我的应用程序启动时 我使用分片首选项中的值填充容器类 这个想法是处理 SharedPreferences 和 PreferenceManager 一次 因为我猜它们很重 这是一个示例 SharedPreferences prefs Pre
  • 使用 APDU 命令的有效 NFC 读取比特率是多少?

    我目前正在使用 Android IsoDep trancieve 函数发送和接收累计 1628 字节的数据 该函数分布在 35 个 APDU 命令 选择应用程序 身份验证 读取 中 字节计数包括返回的 MAC 校验和以及由 transcie
  • 如何最大限度地提高服务器性能?

    我一直在努力了解性能和可扩展性 并想知道开发人员 系统管理员正在做什么来提高他们的系统的效率 为了标准化答案 如果您能尽力回答以下任一问题 将会有所帮助 Profile Magazine publication on Joomla Jobs
  • Pandas dataframe:每批行的操作

    我有一个熊猫数据框df我想计算每批行的一些统计信息 例如 假设我有一个batch size 200000 对于每批batch sizerows 我想要一列的唯一值的数量ID我的数据框 我怎样才能做这样的事情呢 这是我想要的一个例子 prin
  • 添加冗余赋值可以在未经优化的情况下编译时加快代码速度

    我发现一个有趣的现象 include
  • 为 PostgreSQL 查询选择正确的索引

    简化表 CREATE TABLE products product no integer PRIMARY KEY sales integer status varchar 16 category varchar 16 CREATE INDE
  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • CPU 周期与总 CPU 时间

    在 Windows 上 GetProcessTimes 和 QueryProcessCycleTime 可用于获取应用程序所有线程的总计 我期望 显然是天真地 找到总周期数和总处理器时间 用户 内核 之间的比例关系 当转换为相同的单位 秒
  • 为什么 sapply 的缩放速度比样本大小的 for 循环慢?

    假设我想采用向量 X 2 1 N 并将 e 计算为每个元 素的指数 是的 我认识到最好的方法就是通过向量化 exp X 但这样做的目的是将 for 循环与 sapply 进行比较 我通过逐步尝试三种方法 一种使用 for 循环 两种以不同方
  • 正则表达式库基准

    我最近一直想知道正则表达式实现的性能 并且很难想出很多有用的信息 它很容易对浏览器 javascript 正则表达式性能进行基准测试 网上有很多工具 Chrome 和 Opera 中的 javascript 正则表达式实现几乎摧毁了所有其他
  • Javascript 播放声音性能重吗?

    我正在用 Javascript 制作一个简单的游戏 当一个物体与墙壁碰撞时 它会发出 砰 的声音 声音的响度取决于物体的速度 速度越高 gt 声音越大 播放功能 playSound function id vol ID of the sou
  • R 数据结构的运算效率

    我想知道是否有任何关于操作效率的文档R 特别是那些与数据操作相关的 例如 我认为向数据框添加列是有效的 因为我猜您只是向链接列表添加一个元素 我想添加行会更慢 因为向量保存在数组中C level你必须分配一个新的长度数组n 1并将所有元素复
  • 在 MySQL 数据库中保持 TEXT 字段唯一的最佳方法

    我想让 TEXT 字段的值在我的 MySQL 表中唯一 经过小型研究 我发现由于性能问题 每个人都不鼓励在 TEXT 字段上使用 UNIQUE INDEX 我现在想用的是 1 创建另一个字段来包含 TEXT 值的哈希值 md5 text v
  • 编写此代码片段的有效方法是什么? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 更有效和 或更短地重写此代码以节省字节并显得不那么冗长的方法 if N 2 0 N 6 N 8 N 10 N 12 N 14 N 16 N
  • 我的用例可以合并到单个查询中而不影响性能吗?

    我主要着眼于改善表现查询的内容以及是否能够解决单一查询对于我的用例之一 解释如下 涉及到2张表 Table 1 EMPLOYEE column1 column2 email1 email2 column5 column6 Table 2 E
  • 如何改变HTML5视频的播放速度?

    如何更改 HTML5 中的视频播放速度 我查过视频标签的属性 https www w3schools com html html5 video asp在 w3school 但无法做到这一点 根据这个网站 http www chipwreck
  • 要做或不做:将图像存储在数据库中[重复]

    这个问题在这里已经有答案了 在 Web 应用程序的上下文中 我的前老板总是说在数据库中放置对图像的引用 而不是图像本身 我倾向于同意在数据库中存储 url 与图像本身是一个好主意 但在我现在工作的地方 我们在数据库中存储大量图像 我能想到的

随机推荐