代码的优化

在VS中,有两个编译器开关会影响生成的代码的优化:

一个是在项目属性->生成->优化代码选项,如果没有选中该选项,则生成的IL代码是没有经过优化的,在IL文件中会包含很多NOP指令,这些指令是空操作指令,作用是方便设置断点,在流程控制指令后边都会添加NOP指令,对于下面的简单代码:

static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            if (true)
            {
                Console.WriteLine("123");
            }
        }
    }

如果没有经过优化,生成的IL代码是:

.method private hidebysig static void  Main() cil managed
{
  .entrypoint
  .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
  // 代码大小       17 (0x11)
  .maxstack  1
  .locals init ([0] bool CS$4$0000)
  IL_0000:  nop
  IL_0001:  ldc.i4.0
  IL_0002:  stloc.0
  IL_0003:  nop
  IL_0004:  ldstr      "123"
  IL_0009:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000e:  nop
  IL_000f:  nop
  IL_0010:  ret
} // end of method Program::Main

如果选中了优化代码选项,则不会添加NOP指令,则调试的时候没法在流程控制指令(while、if、try、catch等等)上添加端点,对单步调试带来很大困难。但是经过优化的代码是文件变得更小。经过优化后,生成的代码如下:

.method private hidebysig static void  Main() cil managed
{
  .entrypoint
  .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
  // 代码大小       11 (0xb)
  .maxstack  8
  IL_0000:  ldstr      "123"
  IL_0005:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000a:  ret
} // end of method Program::Main

在VS中默认新建一个工程,debug模式是不会进行优化代码的而release模式默认是进行优化代码的,所以我们在写代码的过程中最好使用debug模式,在发布时最好使用release模式。

另外一个属性是在生成->高级里边的调试信息,对于C#而言,该选项一共有三个,none、pdbonly和full。None选项是最少使用的一个,在vs的默认设置中是不需要设置这个的,因为none和pdbonly就性能来说没有任何的不同,并且pdbonly还有独有的优势,这个优势下面马上进行说明。之所以会出现none选项是因为在.NET 1.0的时候他们确实是有区别的。具体信息读者可以查相关文档。

接下来要说的是pdbonly和full,默认VS在debug模式下会设置为full,在release下设置为pdbonly。如果设置成pdbonly,build的时候会生成pdb文件。这个pdb文件中包含IL指令到源代码之间的映射,这个映射可以使得程序在release下运行并且能够进行调试(不是跟进程,而是直接在vs启动),如果我们通过调试-->窗口-->模块观察,可以看到这个时候程序是去加载符号文件的,所以才能够获取断点。

但是pdbonly不能跟进程进行调试,这也是pdbonly和full的主要区别,在生成程序集的时候,有一个属性debuggableAttribute,这个属性标识符号文件会不会连接调试器,full下是true,pdbonly是false,所以我们在通过调试-->窗口-->模块观察,pbdonly程序通过跟进程调试,这个时候程序是跳过符号文件的。

时间: 2024-10-24 23:54:37

代码的优化的相关文章

C++ 代码性能优化 -- 循环分割提高并行性

对于一个可结合和可交换的合并操作来说,比如整数的加法或乘法, 我们可以通过将一组合并操作分割成 2 个或更多的部分,并在最后合并结果来提高性能. 原理: 普通代码只能利用 CPU 的一个寄存器,分割后可以利用多个寄存器. 当分割达到一个数量时,寄存器用完,性能不再提升,甚至会开始下降. 用代码来描述,如下: // 一般情况下的代码 for (i = 1; i < n+1; i++) { res = res OPER i; } // 循环分割后代码 for (i = 1; i < n; i+=2

Java代码性能优化技巧

流方面: private FileOutputStream writer; writer = new FileOoutputStream(fileName); 使用BufferedOutputStream 对写入FileOutputStream的数据进行缓存 //将writer的类型由FileOutputStream 变更为BufferedOutputStream //private FileOutputStream writer; private BufferedOutputStream wr

Java 代码性能优化总结

35 个 Java 代码性能优化总结 前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了.代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨:但是如果有足够的时间开发.维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率

关于前端代码性能优化问题

以下观点纯属个人看法: 对于一个刚接触前端不久的人来说,前端的代码质量是很重要的一部分,毕竟关系到性能问题.个人认为关于代码性能优化主要由这几方面:HTML.CSS.Javascript和HTTP,所以对这四个方面的优化能提高浏览器的性能.个人知识面有限,只有学到以下的知识,另外的还没涉及,不足之处还请体谅. 一. HTML 1.首先是对HTML5的充分熟悉和理解,理解标签的语义化,减少对标签的重定义. 2.命名的规范化,对id.class.name的规范命名有助于整体代码的构建,方便他人的理解

Python 代码性能优化技巧(转)

原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化.扩展以及文档相关的事情通常需要消耗 80% 的工作量.优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率. 改进算法,选择合适的数据结构 一个良好的算法能够对性能起到关键作用,因此性能改进的首要点是对算法的改进.在算法的时间复杂度排序上依次是: O(1) -> O(lg n) -> O(

关于ArrayUtil代码的优化

public int[] removeZero(int[] oldArray) { //传进空数组是返回空数组 if(oldArray == null) return null; int count = 0; //统计非零元素个数 int b[] = new int[oldArray.length]; //先统计非零元素个数,并将非零元素存入一个和原数组同样大小的新数组 for(int i=0; i < oldArray.length; i++) { if(oldArray[i] != 0) {

iOS对项目中所有加阴影的代码进行优化

1. 对项目中所有加阴影的代码进行优化 目前项目中尤其是表格单元格中使用如下加阴影代码严重影响性能(5.2.5航班查询结果页卡顿的原因)     self.cellBG.layer.shadowColor = [[UIColor colorWithRed:0.8 green:0.8 blue:0.8 alpha:1] CGColor];     self.cellBG.layer.shadowOffset = CGSizeMake(1, 1);     self.cellBG.layer.sha

Html代码seo优化最佳布局实例讲解

搜索引擎对html代码是非常优化的,所以html的优化是做好推广的第一步.一个符合seo规则的代码大体如下界面所示. 1.<!–木庄网络博客–> 这个东西是些页面注释的,可以在这里加我的"木庄网络博客",但过多关键字可能被搜索引擎惩罚! 2.<html> 这个是代码开头 结尾时和</html>对应. 3.<head> 头标记结尾用</head> 4.<title>(木庄网络博客-勤记录 懂分享)</title

C6000代码层面优化(一)

2014年8月7日,看了一片很长见识的博文,关于DSP如何优化的,有一个问题没有搞通,“百度”一下关键字,居然搜查了一模一样的博文N片,现在也搞不懂这篇博文的原创作者是谁了.反正我感觉直接转摘过去,要是消化不掉,也没啥意思,所以我把我可以理解消化的就先记录下来吧. 一.双重循环或多重循环在保证功能的前提下,减少嵌套循环的层数,原因有二个,如下: 1)优化器优化时只在最内层循环中形成一个 pipeline,这样循环语句就不能充分利用C6 的软件流水线,而且对于内部循环的次数较少的情况,消耗在 pr