基准代码 - 除以迭代次数?

2023-12-23

我和我的朋友就 C/C++ 代码(或一般代码)的基准测试进行了有趣的讨论。我们编写了一个简单的函数,它使用getrusage测量给定代码段的 CPU 时间。 (它测量运行特定功能所花费的 cpu 时间)。让我举一个例子:

const int iterations = 409600; 
double s = measureCPU(); 
for( j = 0; j < iterations; j++ )
        function(args); 
double e = measureCPU(); 
std::cout << (e-s)/iterations << " s \n";

我们争论,我们是否应该将 (e-s) 除以迭代次数?我的意思是,当我们不除它时,结果是可接受的形式(例如 3.0 s),但是当我们除它时,它会给我们像 2.34385e-07 s 这样的结果......

这是我的问题:

  1. 我们应该将 (e-s) 除以迭代次数吗?如果是,为什么?
  2. 我们如何以更易于阅读的形式打印 2.34385e-07 s? (假设,花了 0.00000003 秒)?
  3. 我们应该首先调用一次函数,然后测量迭代的 cpu 时间,如下所示:

    // first function call, doesnt bother with it at all
    function(args); 
    // real benchmarking
    const int iterations = 409600; 
    double s = measureCPU(); 
    for( j = 0; j < iterations; j++ )
                function(args); 
    double e = measureCPU(); 
    std::cout << (e-s)/iterations << " s \n";
    

  1. 如果将时间除以迭代次数,那么您将得到一个函数的运行时间的迭代独立比较,迭代次数越多,结果越精确。编辑:它是 n 次迭代的平均运行时间。
  2. 您可以将划分时间乘以 1e6 以获得每一个迭代单位的微秒(我假设measureCPU返回秒)

    std::cout << 1e6*(e-s)/iterations << " s \n";
    
  3. 正如 @ogni42 所说,您从 for 循环中获得了测量时间的开销,因此您可以尝试稍微展开循环以降低测量误差,每次迭代执行 8 到 16 次调用,尝试不同的调用计数以了解如何测量的时间变化:

    for( j = 0; j < iterations; j++ ) {
        function(args);
        function(args);
        function(args);
        function(args);
        ...
    }
    
  4. 你基本上得到的是一个越低越好的数字。如果你想要更高更好的得分,你可以 测量函数的不同变化,然后得到最快的变化的时间。这个可以给10分。

    score_for_actual_function = 10.0 * fastest_time / time_of_actual_function
    

这种评分与时间无关,因此您可以比较不同的函数变体,并且该函数的得分可能会低于一分...并且要小心被零除:)

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

基准代码 - 除以迭代次数? 的相关文章

  • C# 打印问题(RichTextBox)

    我想打印我的 RichTextBox eintragRichTextBox 的内容 我现在有这个代码 private void druckenPictureBox Click object sender EventArgs e PrintD
  • 您可以从基本 Win32 控制台模板应用程序中的 C#/Winrt 组件调用(不是 WinForm/abstractions/wrappers 或使用 C++/Winrt 模板)吗?)

    我有一个现有的程序 win32 x86 控制台应用程序 需要调用托管代码 来自 Net 的 C dll The dll不暴露给 COM 但可以从 C WinRT 组件调用并由 C WinRT 控制台模板应用引用 BUT即使安装了 C Win
  • Poco c++Net:Http 从响应中获取标头

    我使用 POCO C Net 库进行 http 我想尝试制定持久缓存策略 首先 我认为我需要从缓存标头中获取过期时间 并与缓存值进行交叉检查 如果我错了 请告诉我 那么我如何从中提取缓存头httpResponse 我已经看到你可以用 Jav
  • C++ 长 switch 语句还是用地图查找?

    在我的 C 应用程序中 我有一些值充当代表其他值的代码 为了翻译代码 我一直在争论使用 switch 语句还是 stl 映射 开关看起来像这样 int code int value switch code case 1 value 10 b
  • 将完整模板参数值映射到原始类型

    我想将数字映射到类型 在这个例子中 我将创建一个函数 将 sizeof 结果映射到有符号的原始类型 我想知道是否有更好的方法来完成我在现代 C 中所做的事情 即采用模板化值并将其转换为类型 现在 这可以将大小转换为已知类型 但我似乎无法在标
  • 从代码中,如何创建对存储在附加属性中的对象的属性的绑定?

    我们有一个继承的附加属性来存储一个对象 在可视化树的更下方 我们希望从代码绑定到该对象的属性 通常我们像这样构建绑定的路径部分 var someBinding new Binding Path new PropertyPath Attach
  • 如何制作可启动程序?

    所以 这个问题可能看起来很奇怪 但假设我编译了 int main void int x 3 int y 4 int z x y 是否可以让CPU这样运行 如何 例如 这允许我写入监视器吗 如果我没记错的话 内存中有些地方可以写入要显示的内容
  • 一元 +/- 运算符如何可能导致“-a”或“+a”中的整数提升,“a”是算术数据类型常量/变量?

    这句看似微不足道的台词摘自我的迈克 巴纳汉和布雷迪的 C 书 第 2 8 8 2 节 http publications gbdirect co uk c book chapter2 expressions and arithmetic h
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • MFC:如何设置CEdit框的焦点?

    我正在开发我的第一个简单的 MFC 项目 但我正在努力解决一个问题 想要设置所有的焦点CEdit其中一个对话框中的框 我的想法是 当打开对话框时 焦点位于第一个编辑框上 然后使用 选项卡 在它们之间交换 我看到了方法SetFocus 但我无
  • 将接口转换为其具体实现对象,反之亦然?

    在 C 中 当我有一个接口和几个具体实现时 我可以将接口强制转换为具体类型 还是将具体类型强制转换为接口 这种情况下的规则是什么 Java 和 C 中都允许这两个方向 向下转型需要显式转型 如果对象类型不正确 可能会抛出异常 然而 向上转换
  • 使用 C# 和 wpf 创建类似 Dock 的应用程序

    我需要创建一个与我们购买笔记本电脑时获得的应用程序类似的应用程序 仅当鼠标指针到达窗口顶部时它才可见 那么我怎样才能使用 C 4 0 来做到这一点呢 http www notebookcheck net uploads pics win2
  • C#6 中的长字符串插值行

    我发现 虽然字符串插值在应用于现有代码库的字符串 Format 调用时非常好 但考虑到通常首选的列限制 字符串对于单行来说很快就会变得太长 特别是当被插值的表达式很复杂时 使用格式字符串 您将获得一个可以拆分为多行的变量列表 var str
  • 在 asp.net MVC 中使用活动目录进行身份验证

    我想使用活动目录对我的 asp net mvc 项目中的用户进行身份验证 在网上冲浪了几个小时后 我没有找到任何对我有用的东西 我已经看到了所有结果 但什么也没有 我尝试按照许多帖子的建议编辑我的 web config 如果有人可以帮助我提
  • 如何使用 NPOI 按地址(A1、A2)获取 Excel 单元格值

    我有一个 Excel 单元格地址 例如 A1 A2 如何使用 C 中的 NPOI 框架以编程方式访问此单元格 我找到的一些 Java POI 示例代码 CellReference cr new CellReference A1 row my
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变
  • 选择查询不适用于使用Parameters.AddWithValue 的参数

    C 中的以下查询不起作用 但我看不出问题所在 string Getquery select from user tbl where emp id emp id and birthdate birthdate cmdR Parameters
  • 在 C#.NET 中安全删除文件

    在我正在做的一个项目中 我想为用户提供 安全 删除文件的选项 例如 用随机位或 0 覆盖它 在 C NET 中是否有一种简单的方法可以做到这一点 效果如何 你可以调用系统内部删除 http technet microsoft com en
  • 为什么以下 C 程序会出现总线错误?

    我认为这是第一个失败的 strtok 调用 好久没写C了 有点不知所措 非常感谢 include
  • 来自 3rd 方库的链接器错误 LNK2019

    我正在将旧的 vc 6 0 应用程序移植到 vs2005 我收到以下链接器错误 我花了几天时间试图找到解决方案 错误LNK2019 无法解析的外部符号 imp 创建AwnService 52 在函数 public int thiscall

随机推荐

  • UILabel sizeToFit 仅适用于关闭自动布局的情况

    所以我正在使用 iOS 6 制作一个应用程序 并且想知道为什么我的代码曾经在 iOS 5 上运行良好 但现在不再运行了 我有一个带有动态 UILabel 的单元格 它会根据它所携带的文本进行调整 这是打开自动布局的情况 这是关闭自动布局的情
  • 使 VBE 助手在使用其他办公应用程序的功能/命令时显示

    我正在编写一些操作其他办公应用程序 office 的代码 当我编写代码时 我希望 VBE 帮助我处理属性和函数 就像它对链接到 Excel 的代码一样 这是怎么做到的 例如 当我输入 word doc 并在后面添加一个点时 我希望 VBE
  • 用于监视 FTP 服务器上的更改的批处理脚本

    我想要制作一个批处理脚本 能够侦听我的 ftp 服务器 并在每次在 ftp 服务器上上传新文件时将文件下载到我的计算机 有任何想法吗 我用的是WinSCP 您可以使用WinSCP 脚本 https winscp net eng docs s
  • WPF - 具有三列的 GridSplitter

    我有一个带有 3 列网格的应用程序 第一列和第二列之间的网格分离器工作得很好 为了使分离器位于第二列和第三列之间 我为分离器制作了一列 所以现在第三列实际上是第四列 当我调整大小时 其他列也会缩小 我认为这是因为我将它们设置为相对大小 但我
  • Golang XML:解组忽略名称空间

    我正在 Go 系统中实现一项从外部 SOAP 服务读取数据的服务 现在我正在为其编写测试 我遇到了这个问题 unable to unmarshal request body for testing expected element type
  • CALayer 优化?

    我添加了几个 CALayer 作为 UIView 层的子层 每层的内容是从服务器下载的不同图像 每个图层都从屏幕外动画到随机生成的位置 图像数据是异步下载的 每个图像大约为 300x300 或更小 由于随机放置 图层重叠 有些图层被上面的图
  • Visual Studio 2010 - 如何强制项目引用使用确切路径而不是 GAC 或程序文件?

    我们永远都会遇到这个问题 我们有很多解决方案和一个相邻的 Components 文件夹 我们要引用的所有 DLL 都在这个文件夹中 其中一些是我们从源代码构建的 以使用仅存在于组件二进制文件中的特定版本号 但是当不同计算机上的用户从 TFS
  • SQL DATE 与 java.sql.Date 中的时区

    我对 SQL DATE 数据类型与 SQL DATE 数据类型的行为感到有点困惑java sql Date 以下面的语句为例 select cast as date in most databases select cast as date
  • 收到 kotlin 错误“等待 60000 毫秒后,测试协程未完成”

    我是测试新手 试图获取第二个流量值并断言它 当我逐个运行此测试时运行良好 但是当我运行整个测试时 第一个测试运行良好 其余测试给我超时错误 Error After waiting for 60000 ms the test coroutin
  • 获取 Android .apk 文件 VersionName 或 VersionCode 而不安装 apk

    下载后 如何以编程方式从 AndroidManifest xml 文件中获取我的 apk 的版本代码或版本名称 而不安装它
  • 序列化 JavaFX 组件

    我正在尝试在 Java FX 下开发一个小型拖放应用程序 用户将按钮 菜单 标签等 JFX 组件放在某些位置 完成后 他将保存此布局 稍后他将重新打开该布局并再次使用它 存储掉落到某个位置的所有物体的信息很重要 我决定为此目的使用序列化 但
  • 在Xcode4中查找变量或方法的所有引用

    有一个类似的问题here https stackoverflow com questions 2831845 xcode view references for a variable但我无法利用 XCode 4 中的答案 我用谷歌搜索了它
  • 在后台使用非托管库时无法更新 WPF GUI

    我在尝试使用 Emgu 从网络摄像头捕获图像时遇到了问题 为了完成此任务 Emgu 使用非托管 opencv 库 所以问题是我无法从 System Timers Timer Elapsed 事件更新我的 GUI WPF 图像控件 我知道它在
  • 使用 d3 画布强制定向图多条边

    我创建了具有多个边的强制有向图 但在渲染后它仅显示 其他一个相互重叠 我想创建类似的东西https bl ocks org mattkohl 146d301c0fc20d89d85880df537de7b0 index html https
  • Users.threads.list() 中缺少很多线程

    我正在使用 Users threads list 方法通过查询 in sent newer than 1y 从我的 GMail 帐户检索线程 结果的第一页 100 个线程 看起来不错 其中包含 2014 年 12 月和 2015 年 1 月
  • 如何在laravel中使用不同的redis连接

    我正在创建一个 laravel 包 在这个包中我需要在 redis 中保存一些数据 但我希望这个包使用不同的 redis 连接 这样如果他们可以在包的配置文件中设置 redis 详细信息凭证 并将使用此连接这个包 我想给包用户自由使用不同的
  • 使用 JAVA API 获取我的 Azure 订阅中所有资源的详细信息

    我正在寻找类似的东西this https stackoverflow com questions 17584084 get a list of all resources in my azure subscription powershel
  • 菜单栏右侧的摆动菜单项

    我有一个 swing 应用程序 在 JFrame 的菜单上我想添加一个帮助菜单项 但要使其右对齐 有任何想法吗 Swing JMenuBar 有一个 BoxLayout 我尝试过 menuItem new JMenuItem Help me
  • program.exe:Native' 已退出,代码为 255 (0xff)

    我正在使用 boost 线程 并且在使用 MD 编译时一切正常 但我真的更喜欢使用 MT 编译 然后我遇到的问题是program exe Native 已退出 代码为255 0xff 这发生在这条线上 thread 1 线程 testThr
  • 基准代码 - 除以迭代次数?

    我和我的朋友就 C C 代码 或一般代码 的基准测试进行了有趣的讨论 我们编写了一个简单的函数 它使用getrusage测量给定代码段的 CPU 时间 它测量运行特定功能所花费的 cpu 时间 让我举一个例子 const int itera