VS2008 C++ 优化器有时会生成较慢的代码吗?

2024-01-11

继从上一个问题 https://stackoverflow.com/questions/5165877/whole-program-optimization-failing-in-vc2008,我一直在我的发布版本中尝试优化器设置,以了解使用编译器优化可以带来哪些好处。到目前为止,我一直在使用 /Ob1 (仅在明确给出内联的情况下内联)和 /Oi (启用内部函数)。我尝试将其更改为包括 /Ot(支持快速代码)、/Oy(省略帧指针)和 /Ob2(内联任何合适的),令我惊讶的是,原来需要 2 小时 58 分钟的回归套件现在需要 3 小时 16 分钟。我的第一个假设是我自己的内联比编译器更积极,但从 /Ob2 回到 /Ob1 仅将事情改进到 3 小时 12 分钟。我仍在运行更多测试,但在某些情况下 /Ot(支持快速代码)实际上会减慢速度。该软件是多线程和计算密集型的(表面建模、操作和可视化),并且已经根据分析器结果进行了大量手动优化。该程序还处理大量数据,并且经常使用#pragma pack(4)。

所以问题是这样的。对于手动优化的程序,VS2008 中的编译器优化是否弊大于利?换句话说,是否存在编译器优化会降低性能的已知记录场景? (注意,分析编译器优化的代码是很痛苦的,因此迄今为止的分析都是在未优化的代码上完成的)。

Edit根据 Cody Gray 和其他人的建议,我已将 /O2 添加到优化设置中并重新执行我的测试套件。这导致运行时间为 3 小时 1 秒,与最低限度优化的运行时间相当。鉴于(稍微过时)MSDN 优化指南 http://msdn.microsoft.com/en-us/library/aa290055(v=vs.71).aspx并从 GOZ 发帖,我将检查 /O1 看看在我的情况下较小是否实际上更快。请注意,当前的 EXE 文件大约为 11mb。我还将尝试一起构建 VS2010,看看效果如何。

Edit2使用 /O1,运行时间为 3 小时,11mb 的 exe 缩小了 62k。请注意,这篇文章和上一篇链接文章背后的原因是检查打开编译器优化的好处是否超过了分析和调试方面的缺点。在这个特定的例子中,它们似乎并非如此,尽管我承认对尝试的所有组合都没有增加任何好处并且性能明显下降感到惊讶。 FWIW,根据这个上一个线程 https://stackoverflow.com/questions/385506/when-is-optimisation-premature/385825#385825,我倾向于在设计时进行大部分优化,并主要使用分析器来检查设计假设,我认为我会坚持使用这种方法。我将在启用整个程序优化的情况下对 VS2010 进行最后一次尝试,然后就到此为止。

感谢您的所有反馈!


The 文档 http://msdn.microsoft.com/en-us/library/f9534wye.aspx for /Ot states:

如果你使用/Os or /Ot,那么您还必须指定/Og来优化代码。

所以你可能想总是通过/Og with /Ot在你的测试中。

也就是说,/Ot以牺牲程序大小为代价来支持快速代码,并且可以生成非常大的二进制文件,尤其是在大量内联的情况下。大型二进制文件很难利用处理器缓存。

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

VS2008 C++ 优化器有时会生成较慢的代码吗? 的相关文章

  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 按成员序列化

    我已经实现了template
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 为什么在 JavaScript 构造函数中使用副作用是不好的做法?

    我使用与设计模式非常相似的东西自定义对象 http www klauskomenda com code javascript programming patterns custom通常在我的代码中 但 JSLint 不赞成这样的构造 fun
  • 远程运行 Perl 脚本时使用 MsgBox 回显变量?

    这可能吗 我正在使用 VB net 执行远程 Perl 脚本 我希望屏幕上出现一个 MsgBox 类似于 VBScript 我尝试只执行 Win32 MsgBox Test 但这不起作用 有可能吗 我正在从 Windows 系统远程执行脚本
  • 计算两幅图像之间的模糊内核

    与标准 且更具挑战性 去模糊和超分辨率场景不同 我可以访问原始 清晰 图像G而且是模糊版本B 我只是在寻找模糊内核h 所以因为B使用真实相机拍摄 关系为 B G h N 在哪里 表示卷积和N是一些附加噪声 自然 这是一个过度约束的问题 因为
  • 正则表达式仅匹配不在括号或方括号中的逗号

    我想用不在括号或方括号中的逗号分隔字符串 我正在使用以下字符串 土豆 植物油 向日葵油 玉米油和 或菜籽油 蜂蜜 烧烤调味料 糖 盐 葡萄糖 圆酵母 洋葱粉 香料 麦芽糊精果糖 酵母提取物 糖蜜 天然香料 含牛奶 玉米淀粉 蜂蜜 阿拉伯胶
  • 直接用户输入的动态 LINQ 有什么危险吗?

    我在 ASP NET MVC 应用程序中有一个表 我希望可以使用 AJAX 对其进行排序 服务器端 和过滤 我希望它在其他地方相当容易使用 并且不想将排序和过滤硬编码到查询表达式中 因此我寻找一种动态构建表达式的方法 我发现最好的方法是使用
  • 如何将 CSS 变换矩阵转换回其组件属性

    我通过使用获得了元素的 CSS 变换矩阵getComputedStyle 方法如下 var style window getComputedStyle elem1 null var trans style transform 反式 矩阵 1
  • 使用 LINQ LAMBDA 获取每个部门的员工

    我正在尝试使用 LINQ 连接两个表员工和部门 并尝试获取下面给出的图像格式的结果 有人可以帮助如何实现这一目标吗 如何实现每个部门的员工 这是我的代码 var EmpList from d in Department join e in
  • 初始加载后取消选择列表框中的所有项目

    我有一个列表框 最初显示时选择了第一个项目 我希望它显示时未选择任何项目 这可能吗 ListBox ClearSelected or ListBox SelectedIndex 1 当然 它们是成员方法
  • 导航栏下方的空白区域

    When self navigationController navigationBar translucent NO 导航栏下方出现空白 如下所示 我怎样才能删除它 From above example void loadUI self
  • 找不到模块 ember-validations

    尝试使用 ember cli 的 ember validations 插件 遇到这个问题 我不知道缺少什么 这是我的 package json 中的依赖项部分 devDependencies broccoli asset rev 2 0 0
  • 未找到 Xamarin 方法“CGSize..ctor”

    我刚刚更新了 xamarin studio 然后更新了我的 iOS 项目中的 xamarin forms 包 一切都构建得很好 但是当我尝试在模拟器中运行该应用程序时 出现以下错误 未找到方法 CGSize ctor 我创建了一个新的解决方
  • Laravel Blade 表单关闭问题

    我在 Laravel 中有一个这样的表单 div class modal body Form model questionGroup route gt question groups update questionGroup gt id m
  • 如何使用 uniqueId() jquery ui

    似乎 jquery ui 已加载 因为当我运行时 function did the UI load console log ui version JS控制台返回1 10 3 我正在使用宝石https github com joliss jq
  • Pandas 将 groupby 总和值分配给原始表中的最后一行

    例如 我有一张桌子 A id price sum 1 2 0 1 6 0 1 4 0 2 2 0 2 10 0 2 1 0 2 5 0 3 1 0 3 5 0 我想要的就像 最后一行sum应该是price一个团体的 id price sum
  • Asp.net 会员资格 - 帐户被锁定

    我们正在使用 ASP net 附带的标准 ASP net 会员功能 我们的会员数据库中的某些帐户将 锁定 标志设置为 true 这种情况何时 如何发生 在可配置的时间长度 passwordAttemptWindow 默认 10 分钟 内登录
  • JQuery FullCalendar 从 ajax 成功调用 rerenderEvents 时出现问题

    由于某种原因 我无法在 POST 后重新呈现日历 到那时一切都很顺利 calendar fullCalendar select function startDate endDate ajax url data php type POST d
  • 使用 Skip/Take 进行分页时 LINQ 查询性能极差

    我需要使用 LINQ 从 DB2 数据库查询记录 我有从数据库架构生成的实体 并尝试使用 Skip 和 Take 执行 LINQ 查询 基础表大约有 25 列 可能有 100 万条记录 当我在没有 Skip 的情况下执行查询时 大约需要 0
  • 反应式表单提交后显示错误消息

    在 Angular 8 Reactive 表单上 我有以下内容
  • phonegap 3.5.0 中缺少 Cordova jar

    在我使用phonegap 2 7 0之前 因此 对于phonegap更新 我使用node js安装了phonegap版本3 5 0 但在phonegap文件夹中没有cordova jar文件 如果我在 ADT 中创建一个项目 如何添加 co
  • VS2008 C++ 优化器有时会生成较慢的代码吗?

    继从上一个问题 https stackoverflow com questions 5165877 whole program optimization failing in vc2008 我一直在我的发布版本中尝试优化器设置 以了解使用编