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

回答是:不,生成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. RabbitMQ之消息模式(下)

    目的: RabbitMQ之消息模式(上):https://www.cnblogs.com/huangting/p/11994539.html 消费端限流 消息的ACK与重回队列 TTL消息 死信队列 ...

  2. 在local模式下的spark程序打包到集群上运行

    一.前期准备 前期的环境准备,在Linux系统下要有Hadoop系统,spark伪分布式或者分布式,具体的教程可以查阅我的这两篇博客: Hadoop2.0伪分布式平台环境搭建 Spark2.4.0伪分 ...

  3. win10下更新anaconda和pip源

    第一步:更新anaconda源. anaconda的官方源太慢,推荐清华源:https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ 软件下载也可以在这个 ...

  4. nginx.conf配置demo

    #user nobody; worker_processes 4; #error_log logs/error.log; #error_log logs/error.log notice; #erro ...

  5. spark-sql使用笔记

    如何使用hive的udf 可以使用spark-sql --jars /opt/hive/udf.jar,指定udf的路径 还可以在spark-default.conf里指定spark.jars /op ...

  6. springboot 接口参数校验

    前言 在开发接口的时候,参数校验是必不可少的.参数的类型,长度等规则,在开发初期都应该由产品经理或者技术负责人等来约定.如果不对入参做校验,很有可能会因为一些不合法的参数而导致系统出现异常. 上一篇文 ...

  7. Jmeter学习笔记(二十)——后置处理器XPath Extractor使用

    一.背景 在使用过程某些操作步骤与其相邻步骤存在一定的依赖关系,需要需要将上一个请求的响应结果作为下一个请求的参数. Jmeter中后置处理器正则表达式提取器和XPath Extractor都可以将页 ...

  8. 在Linux系统上安装Spring boot应用

    Unix/Linux 服务 systemd 服务 操作过程 1. 安装了JDK的centOS7虚拟机 注意下载linux版本JDK的时候不能直接通过wget这种直接链接下载,否则会解压不成功,应该打开 ...

  9. [LeetCode] 78. 子集 ☆☆☆(回溯)

    描述 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3]输出:[ [3],  [1],  [2] ...

  10. PHP java时间戳转php时间戳

    /** * java时间戳转php时间戳 * @param int $javaUt java的时间戳 * @return int * @Date 2019/8/26 */ public static ...