有人问了这样的问题:"我工作的公司正极力反对用生成的调试信息构建发布模式二进制文件,这也是我注册该类的原因之一。他们担心演示会受到影响。我的问题是,在发布模式下生成符号的最佳命令行参数是什么?还有什么地方我可以参考,以表明不应该有性能问题。“

回答是:不,生成PDB文件对性能没有任何影响。至于我也可以给你指出的参考资料,我在网上还没有找到任何能回答确切问题的资料,所以让我依次介绍.NET和本机开发。

Eric Lippert写了一篇很棒的文章,优化开关是做什么的?他讨论了编译器和即时(JIT)编译器所做的优化。(基本上,您可以将其总结为JITter完成所有实际的优化工作。)C#和VB.NET编译器之间的切换有些混乱,因为有四个不同的/debug开关,/debug,/debug+,/debug:full和/debug:pdb。我之所以造成这种混乱,是因为我认为/debug:pdb只做了一些与其他三个/debug开关不同的事情,它们对发布版本的构建更好。

所有四个开关都做相同的事情,因为它们会生成一个PDB文件,但为什么有四个开关做相同的事情?微软开发人员真的喜欢解析稍微不同的命令行选项吗?真正的原因是:历史。在.NET1.0中有差异,但在.NET2.0中没有。看起来.NET4.0将遵循相同的模式。在与CLR调试团队进行了反复检查之后,没有任何区别。

控制抖动是否执行调试生成的是/optimize开关。使用/optimize构建-将在程序集中添加一个属性DebuggableAttribute,并将DebuggingMode参数设置为DisableOptimizations。不需要罗兹学者就能弄明白,禁用优化正是按照它所说的做的。

归根结底,您希望使用/optimize+和任何/debug开关来构建发布版本,以便可以使用源代码进行调试。阅读Visual Studio文档,了解如何在不同类型的项目中设置这些开关。

很容易证明这些是最佳开关。使用我的示例程序,我用/optimize+和/debug编译了一个构建,用just/optimize+编译了另一个构建。这与/debug+和/debug相同,而另一个与/optimize+/debug:pdbonly相同,显示了不同之处,这是我们错误的根源。编译之后,我使用ILDASM和以下命令行从二进制文件中获取原始信息

ILDASM /out=Paraffin.IL Paraffin.exe

使用diff工具,您将看到两个构建之间的IL本身是相同的。主要区别在于程序集的DebuggableAttribute声明。在build/optimize+和a/debug开关时,一个DebuggingMode.IgnoreSequencePoints被传递给DebuggableAttribute,告诉JIT编译器不需要加载PDB文件就可以正确地对IL进行JIT。DebuggingMode的值。默认值也为或,但该值被忽略。

与.NET一样,构建PDB文件与优化无关,因此对应用程序的性能没有影响。如果你的经理用说是“害怕业绩会受到影响”,我就告诉他们。(不幸的是,我遇到的经理中,说这话的人比我想象的还多)。

NET非常简单,因为实际上只有两个开关,所以适当的优化开关取决于许多单独的应用程序因素。我能告诉你的是在发布版本中正确生成PDB文件需要设置哪些开关。

对于编译器CL.EXE,您需要添加/Zi以使其将调试符号放入.OBJ文件。对于链接器LINK.EXE,需要指定三个选项。第一个是/DEBUG,它告诉链接器生成一个PDB文件。但是,该开关还告诉链接器这是调试生成。这不太好,因为这会影响二进制文件的性能。基本上,使用/调试时发生的情况是链接器链接速度更快,因为它不再查找单个引用。如果使用OBJ中的一个函数,链接器会将整个OBJ抛出到输出二进制文件中,因此现在有一堆死函数。

要告诉链接器只需要引用的函数,需要添加/OPT:REF作为第二个开关。第三个开关是/OPT:ICF,它启用了COMDAT折叠。有一个术语你不是每天都听到。基本上,这意味着在生成二进制文件时,链接器将查找具有相同代码的函数,并且只生成一个函数,但使多个符号指向一个函数。

如果您想自己在本机二进制文件上测试差异,以查看对生成PDB文件有什么影响,这几乎和.NET二进制文件一样简单。Visual Studio附带了一个很好的小程序DUMPBIN,它可以告诉您关于可移植可执行文件的更多信息使用/DISASM开关运行它以获得二进制文件的反汇编。

PDB文件会影响性能吗?的更多相关文章

  1. pdb文件 PDB文件:每个开发人员都必须知道的 .NET PDB文件到底是什么?

    pdb文件包含了编译后程序指向源代码的位置信息,用于调试的时候定位到源代码,主要是用来方便调试的. 在程序发布为release模式时,建议将 pdb文件删除, 同时,对外发布的时候,也把 pdb删除, ...

  2. 【C# 调试】.net中的 .pdb文件是什么,有什么用

    mscn:在 Visual Studio 调试器(C#)中指定符号 (.pdb) 和源文件 PDB全称Program Database,程序数据库 ( .pdb) 文件(也称为符号文件)将项目源代码中 ...

  3. NET PDB文件到底包含多少秘密?

    虽然我希望.NET PDB文件与本地PDB文件处理方式相同,但我们在这件事上没有任何选择,因为事情就是这样.我相信微软的调试器团队多年来听到过很多类似帕特里克的评论.也许我们会在未来的Visual S ...

  4. Visual Studio 不生成.vshost.exe和.pdb文件的方法【转】

    Visual Studio 不生成.vshost.exe和.pdb文件的方法[转] 使用Visual Studio编译工程时,默认设置下,即使选择了「Release」时也会生成扩展名为「.vshost ...

  5. 理解 OpenStack Swift (3):监控和一些影响性能的因素 [Monitoring and Performance]

    本系列文章着重学习和研究OpenStack Swift,包括环境搭建.原理.架构.监控和性能等. (1)OpenStack + 三节点Swift 集群+ HAProxy + UCARP 安装和配置 ( ...

  6. PDB文件:每个开发人员都必须知道的

    PDB Files: What Every Developer Must Knowhttp://www.wintellect.com/CS/blogs/jrobbins/archive/2009/05 ...

  7. Visual Studio 不生成.vshost.exe和.pdb文件的方法

    使用Visual Studio编译工程时,默认设置下,即使选择了「Release」时也会生成扩展名为「.vshost.exe」和「.pdb」的文件. 一.先解释一下各个文件的作用: .pdb文件: 程 ...

  8. C#输出到Release VS中Release模式下生成去掉生成pdb文件

    Release 与 Debug 的区别就不多说了, 简单来说 Release 优化过, 性能高一些. Debug 为方便调试. 默认情况下是 Debug, 那如何改成 Release 呢? 项目上右键 ...

  9. PDB文件:每个开发人员都必须知道的 PDB Files

    PDB文件:每个开发人员都必须知道的   PDB Files: What Every Developer Must Knowhttp://www.wintellect.com/CS/blogs/jro ...

随机推荐

  1. Dijkstra堆优化+邻接表

    Dijkstra算法是个不错的算法,但是在优化前时间复杂度太高了,为O(nm). 在经过堆优化后(具体实现用的c++ STL的priority_queue),时间复杂度为O((m+n) log n), ...

  2. 2019-07-24 PHP中mysql_fetch_assoc 和 mysql_fetch_array 有什么区别?

    mysql_fetch_assoc() 函数从结果集中取得一行作为关联数组 来看下面的例子: 数据库中有上述几条数据,一般我们想取用就要按照如下代码: $con = mysql_connect('12 ...

  3. 【夯实基础】- Integer.valueof()和Integer.parseInt()的区别

    今天在看公司代码的时候,看到有人在将 String 转为 int 时,用到了Integer.parseInt(String s)方法,我一直用的是Integer.valueOf(String s)方法 ...

  4. nodejs中的_filename和_dirname

    _filename和_dirname都不是全局对象下的属性,它们都是模块下的 _filename:返回当前模块文件被解析过后的绝对路径,该属性并非全局,而是模块作用域下的 console.log(_f ...

  5. 一张图带你看懂原始dao与SQL动态代理开发的区别-Mybatis

    //转载请注明出处:https://www.cnblogs.com/nreg/p/11156167.html 1.项目结构区别: 2.开发区别: 注:其中原始dao开发的实现类UserDaoImpl ...

  6. caement Archaic spelling of cement

    caement Archaic spelling of cement. caement Alternative forms[edit] caement (archaic) cæment (archai ...

  7. php中call_user_func()与call_user_func_array()区别

    call_user_func:把一个参数作为回调函数调用 用法说明: call_user_func ( callable $callback [, mixed $parameter [, mixed ...

  8. MySQL MHA--在线主库切换(Online master switch)

    在线主库切换(Online master switch)条件 1.所有节点正常运行,无论时原主还是新主或者其他从库 if ( $#dead_servers >= 0 ) { $log->e ...

  9. JMeter性能测试,入门

    原文转自:https://blog.csdn.net/lovesoo/article/details/78579547 Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件 ...

  10. Linux无法被远程登录;用户的关机, 重启,注销,新增用户,删除用户

    不能使用xshell连接到我的Linux服务器 通过再windows的cmd中ping了我的Linux地址,发现网络不通. 查看百度发现是因为网络没有选桥接模式,然后选完桥接模式告诉我: 然后发现没有 ...