首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何正确对[模板] C++程序进行基准测试

如何正确对[模板] C++程序进行基准测试
EN

Stack Overflow用户
提问于 2009-01-12 06:46:22
回答 11查看 4K关注 0票数 7

< backgound>

我正处在一个真正需要优化C++代码的阶段。我正在为分子模拟编写一个库,我需要添加一个新的特性。过去,我已经尝试过添加这个特性,但是后来我使用了嵌套循环中调用的虚拟函数。我对此有不好的感觉,第一个实现证明了这是个坏主意。然而,这是可以测试的概念。

< /background>

现在我需要这个功能尽可能快(好吧,没有汇编代码或GPU计算,这仍然必须是C++和更多可读性而不是更少)。现在,我对模板和类策略有了更多的了解(来自Alexandrescu的优秀著作),我认为编译时代码生成可能是解决方案。

然而,在完成将其实现到库中的巨大工作之前,我需要对设计进行测试。问题在于测试这一新特性的效率的最佳方法。

显然,我需要打开优化,因为如果没有这个g++ (可能还有其他编译器),目标代码中就会保留一些不必要的操作。我还需要大量使用基准测试中的新特性,因为1e-3秒的增量可以区分好的设计和糟糕的设计(这个特性在实际程序中将被称为百万次)。

问题是,g++有时在优化时“太聪明”,如果它认为计算结果从未被使用,它可以删除整个循环。在查看输出程序集代码时,我已经看到过一次。

如果我将一些打印添加到stdout中,那么编译器将被迫在循环中执行计算,但我可能主要是对iostream实现进行基准测试。

那么,如何对从库中提取的一个小特性执行正确的基准测试呢?相关问题:在一个小单元上进行这种体外测试是一种正确的方法,还是我需要完整的上下文?

谢谢你的建议!

似乎有几种策略,从允许微调的编译器特定选项到更通用的解决方案,这些解决方案应该适用于每个编译器,比如volatileextern

我想我会尝试所有这些。非常感谢你所有的答案!

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-01-13 07:09:17

如果要强制任何编译器不丢弃结果,请将结果写入易失性对象。根据定义,无法优化该操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template<typename T> void sink(T const& t) {
   volatile T sinkhole = t;
}

没有iostream开销,只需在生成的代码中保留一个副本。现在,如果您正在收集许多操作的结果,最好不要一个一个地丢弃它们。这些副本仍然可以增加一些开销。相反,以某种方式收集单个非易失性对象中的所有结果(因此需要所有单独的结果),然后将结果对象分配给易失性对象。例如,如果您的单个操作都生成字符串,则可以通过将所有char值一起添加到模块化1<<32来强制求值。这几乎不会增加任何开销;字符串可能在缓存中。加法的结果随后会被分配给易失性,所以每个刺中的每一个字符实际上都必须被计算,不允许捷径。

票数 6
EN

Stack Overflow用户

发布于 2009-01-12 06:51:35

除非您有一个真正积极的编译器(可能发生),否则我建议计算一个校验和(简单地将所有结果加在一起)并输出校验和。

除此之外,您可能需要在运行任何基准测试之前查看生成的程序集代码,以便直观地验证是否正在实际运行任何循环。

票数 1
EN

Stack Overflow用户

发布于 2009-01-12 07:10:03

编译器只允许消除不能发生的代码分支.只要不排除要执行一个分支,它就不会消灭它。只要在某个地方存在某些数据依赖项,代码就会在那里运行。编译器在估计程序的哪些方面将不会运行时并不太聪明,也不尝试运行,因为这是一个NP问题,很难计算。他们有一些简单的检查,比如if (0),但仅此而已。

我的基本观点是,您可能前面遇到了其他问题,例如C/C++计算布尔表达式的方式。

但是无论如何,因为这是关于速度的测试,所以您可以自己检查是否调用了它--运行它一次,然后用返回值进行另一次测试。或者一个静态变量被递增。在测试结束时,打印出生成的数字。结果是相等的。

来回答你关于试管测试的问题:是的,去做吧。如果你的应用程序时间如此紧迫,那就去做吧。另一方面,您的描述暗示了一个不同的问题:如果您的三角洲处于1e-3秒的时间范围内,那么这听起来就像是一个计算复杂性问题,因为所讨论的方法必须经常被调用(对于很少的运行,1e-3秒是可以忽略的)。

您正在建模的问题域听起来非常复杂,而且数据集可能很大。这样的事情总是很有趣的。不过,首先要确保你有正确的数据结构和算法,然后再对你想要的一切进行微观优化。因此,我要说的是,首先看一下整个上下文。 ;-)

出于好奇,你在计算什么问题?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/435627

复制
相关文章
GridView添加新列并绑定控件
4、创建控件事件(不能是click事件,关联字段触发的事件要创建Command事件)
用针戳左手中指指头
2021/01/29
1.2K0
GridView添加新列并绑定控件
asp.net中的Gridview控件添加序号列
在这种方法中,如果使用gridview控件自带的分页功能添加序号列后,每一页的序号都会从1开始。
全栈程序员站长
2022/08/09
1.7K0
获取GridView中的某列值
    protected void GridView1_RowEditing(object sen
Java架构师必看
2021/03/22
10.2K0
Typecho在指定段落后面添加广告代码的方法
今天有网友在留言里提到Typecho是否可以像WordPress一样实现自动在网站内容指定段落后面添加广告的代码模式《WordPress利用插件和非插件实现任意段落添加广告代码片段》,老蒋当然也没有遇到过这个问题,于是我就发挥寻找能力,找呀找,找到方法记录下来。
老蒋
2021/12/24
7370
gridview属性_datagridview设置列宽
using System; using System.Collections.Generic; using System.Text; using System.Drawing; using System.Windows.Forms;
全栈程序员站长
2022/11/09
1.7K0
GridView隐藏列取值解决方案
在Asp.net 2.0中增加了一个新的数据绑定控件:GridView,其目的用来取代Asp.net1.x中的DataGrid控件,但有一点很不爽的是,如果把某列设置为visible=false,则不会进行数据绑定,也就是说无法直接从GridView中取到这个列内的文本。
Java架构师必看
2021/03/22
1.5K0
在gridview和datagrid里设置列宽
无论是gridview还是datagrid,在绑定数据后,列宽都不是固定的,在设计时是没法设定的,只能通过绑定是触发的事件来重新设定。参考http://msdn2.microsoft.com/zh-cn/library/ms178296(VS.80).aspx 的解释. gridview的代码: protected int widestData; protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
Jianbo
2018/01/15
1.2K0
gridview列 数字、货币和日期 显示格式
在设置gridview等数据绑定控件的模版列时,总要设置显示的格式,这里是我查询一些资料后统计出来的。
Java架构师必看
2021/03/22
1.3K0
gridview属性_文档代码
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/09/29
5120
GridView利用CheckBox复选框列实现单选功能
自Dev13.2开始,GridView提供了自带的复选框列,该功能能实现多选操作,方便了不少,那如果想把这个自带的复选框列做成单选,那就需要单独处理了。
全栈程序员站长
2022/08/23
2K0
GridView利用CheckBox复选框列实现单选功能
PBI-基础入门:添加列与新建列(计算列)
大海:在Power BI里增加列有2种方法,一种是咱们在学Power Query里的“添加列”方法,还有一种是在PowerPivot里的新建“计算列”方法。具体操作方法如下:
大海Power
2021/08/30
7.6K0
PQ基础-数据转换4:删列、移列、添加索引列
本文通过一个例子,综合体现常用的删列、移列、添加索引列操作方法。数据样式及要求如下:
大海Power
2021/08/31
1.7K0
GridView使用RenderControl取得HTML的问题[通俗易懂]
如果想在CodeFile中取得GridView结果的HTML内容,首先会遇到这样的错误讯息:
全栈程序员站长
2022/09/09
5290
分离链接的散列散列代码实现
散列 散列为一种用于以常数平均时间执行插入,删除和查找的技术。一般的实现方法是使通过数据的关键字可以计算出该数据所在散列中的位置,类似于Python中的字典。关于散列需要解决以下问题: 散列的关键字如何映射为一个数(索引)——散列函数 当两个关键字的散列函数结果相同时,如何解决——冲突 散列函数 散列函数为关键字->索引的函数,常用的关键字为字符串,则需要一个字符串->整数的映射关系,常见的三种散列函数为: ASCII码累加(简单) 计算前三个字符的加权和$\sum key[i] * 27^{i}$ (不太
月见樽
2018/04/27
1.6K0
利用代码破解QQ无法查找添加的问题
解决如下问题: 此原因是用户设置主显账号,但是我们一样能够查找添加的。 代码:tencent://AddContact/?fromId=45&fromSubId=1&subcmd=all&uin=Q
Lcry
2022/11/29
2.9K0
gridview布局_GridView
<link href=”StyleSheet.css” rel=”stylesheet” type=”text/css” />
全栈程序员站长
2022/11/09
8160
gridview布局_GridView
gridview属性_GridView
GridView在生成HTML代码的时候会自动加上style=”border-collapse:collapse;”以及border=1,rules=”all”这些属性,这些在IE下都没什么影响,但是在FF下就会影响显示,style=”border-collapse:collapse;”;是由于设置了CellSpacing=”0″产生的,当设置CellSpacing=”1″后就没有,可以去掉style=”border-collapse:collapse;”;默认情况下CellSpacing=”0″,所以默认情况下会有style=”border-collapse:collapse;”这个属性生成。GridLines=”Both”会带来border=1,rules=all这两个属性,设置GridLines=”None”后border=0,rules属性则不会出现。
全栈程序员站长
2022/11/08
1.5K0
hive中常量列的添加和查询
在正常应用场景中,常常会从HIVE中直接获取某个DATAFRAME,这个dataframe除了与数据表中某些字段的提取,还往往会涉及到一些常量列的添加,用以如区分数据等场景。
sparkexpert
2022/05/07
1.2K0
hive中常量列的添加和查询
点击加载更多

相似问题

将变量添加到所有日志消息中

121

如何将变量属性添加到此设计

11

将变量作为前缀添加到所有nLog消息

10

如何将消息添加到Laravel4.2中的$errors变量中

23

jquery:将变量添加到变量中

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文