C#编译器对局部变量的优化指南

前言

C# 的编译器可以对代码进行优化,所以,我们在写代码的时候,可以更多地考虑一下代码的易读性问题。

不考虑基本的对齐和换行美化。看一下局部变量优化问题。

C# 示例代码

例如,我们有一段如下的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
 class Program
 {
  static void Main(string[] args)
  {
   var s = DoSomething();
   Console.WriteLine(s);
  }

  static string DoSomething()
  {
   var s1 = "Hello, world.";
   var s2 = s1.ToUpper();
   return s2;
  }
 }
}

在 DoSomething() 这个方法中,里面定义了两个局部变量:

  • s1
  • s2

在 Main() 方法中,定义了一个局部变量:

  • s

定义 s1 和 s2 是为了提高代码的可读性,它们会导致生成冗余的代码,降低执行效率吗?

我们分别在 Debug 模式下和 Release 模式下进行编译,使用 ILDasm 查看生成的中间代码。

Debug 模式下生成的中间代码

在 Debug 下编译之后,DoSomething() 生成的中间代码如下,可以看到实际上有 3 个局部变量。除了我们自己定义的 s1 和 s2 之外,还有一个生成的 V_2,代码的尺寸为 20。

.method private hidebysig static string DoSomething() cil managed
{
 // Code size  20 (0x14)
 .maxstack 1
 .locals init ([0] string s1,
   [1] string s2,
   [2] string V_2)
 IL_0000: nop
 IL_0001: ldstr  "Hello, world."
 IL_0006: stloc.0
 IL_0007: ldloc.0
 IL_0008: callvirt instance string [mscorlib]System.String::ToUpper()
 IL_000d: stloc.1
 IL_000e: ldloc.1
 IL_000f: stloc.2
 IL_0010: br.s  IL_0012
 IL_0012: ldloc.2
 IL_0013: ret
} // end of method Program::DoSomething

看一下 Main() 方法。

有我们定义的 s 这一个局部变量,代码尺寸为 15 个字节。

.method private hidebysig static void Main(string[] args) cil managed
{
 .entrypoint
 // Code size  15 (0xf)
 .maxstack 1
 .locals init ([0] string s)
 IL_0000: nop
 IL_0001: call  string ConsoleApp1.Program::DoSomething()
 IL_0006: stloc.0
 IL_0007: ldloc.0
 IL_0008: call  void [mscorlib]System.Console::WriteLine(string)
 IL_000d: nop
 IL_000e: ret
} // end of method Program::Main

Release 模式下生成的中间代码

而在 Release 模式下,实际上,DoSomething() 中所有的局部变量都被优化掉了。代码尺寸也只有 11 个字节。

.method private hidebysig static string DoSomething() cil managed
{
 // Code size  11 (0xb)
 .maxstack 8
 IL_0000: ldstr  "Hello, world."
 IL_0005: callvirt instance string [mscorlib]System.String::ToUpper()
 IL_000a: ret
} // end of method Program::DoSomething

还可以看一下 Main() 方法,这个局部变量 s 也被优化掉了。代码尺寸也只有 11 字节了。

.method private hidebysig static void Main(string[] args) cil managed
{
 .entrypoint
 // Code size  11 (0xb)
 .maxstack 8
 IL_0000: call  string ConsoleApp1.Program::DoSomething()
 IL_0005: call  void [mscorlib]System.Console::WriteLine(string)
 IL_000a: ret
} // end of method Program::Main

结论

编译器会尽可能对代码进行优化,我们可以为了提高代码的易读性增加一些局部变量,这并不会导致生成冗余代码并导致执行性能的下降。

到此这篇关于C#编译器对局部变量优化的文章就介绍到这了,更多相关C#编译器对局部变量优化内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C#特性 匿名类型与隐式类型局部变量使用介绍

    在本篇中我要介绍两个概念,我觉得这两个东西必须一起来介绍,这样才能连贯. C# 2.0里我们已经匿名方法了,现在类型也玩起匿名来了,怪不得大家"举报"的时候都喜欢匿名,为啥?因为匿名被举报人就找不着报复对象了呗,是的,匿名就是把名字隐藏起来,没有名字谁还能找得到你啊. 匿名类型 在C#里有这样一些类型,它是作为临时储存数据的,生命周期只在这个方法内,方法结束了,这个类型的生命周期也没有了.那么这里我们就可以使用一个匿名类型. 复制代码 代码如下: var KeyPair = new {

  • C# 7.0之ref locals and returns(局部变量和引用返回)

    没看过原文的请移步: [干货来袭]C#7.0新特性(VS2017可用) 废话不多说,直接进入正题.首先我们知道ref关键字是将值传递变为引用传递,那么我们先来看看ref locals(ref局部变量) 列子代码如下: static void Main(string[] args) { int x = 3; ref int x1 = ref x; //注意这里,我们通过ref关键字 把x赋给了x1 x1 = 2; Console.WriteLine($"改变后的变量 {nameof(x)} 值为:

  • C#中的局部变量冲突问题

    一个变量在同一个作用域中不能够声明两次,如下代码错误. using System; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; namespaceConsoleApplication1 { class Program { static void Main(string[] args) { int a =123; int a =456; } } }

  • C#:(变量)字段和局部变量的作用域冲突

    C#把声明为类型级的变量看作字段,而把在方法中声明的变量看作局部变量. 复制代码 代码如下: using System; namespace ConsoleApplication10{class Program{static int j = 20; public static void Main(string[] args){int j = 30;Console.WriteLine("In the Main()" + j);Console.WriteLine(Program.j);Co

  • C#编译器对局部变量的优化指南

    前言 C# 的编译器可以对代码进行优化,所以,我们在写代码的时候,可以更多地考虑一下代码的易读性问题. 不考虑基本的对齐和换行美化.看一下局部变量优化问题. C# 示例代码 例如,我们有一段如下的代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp1 { class Pr

  • jQuery 性能优化指南(3)

    8,尽量使用ID代替Class. 前面性能优化已经说过,ID选择器的速度是最快的.所以在HTML代码中,能使用ID的尽量使用ID来代替class.看下面的一个例子: // 创建一个list var $myList = $('#myList'); var myListItems = '<ul>'; for (i = 0; i < 1000; i++) { myListItems += '<li class="listItem' + i + '">This i

  • jQuery 性能优化指南 (1)

    1,总是从ID选择器开始继承 在jQuery中最快的选择器是ID选择器,因为它直接来自于JavaScript的getElementById()方法. 例如有一段HTML代码: 复制代码 代码如下: <div id="content"> <form method="post" action="#"> <h2>交通信号灯</h2> <ul id="traffic_light"&

  • jQuery 性能优化指南(2)

    4,对直接的DOM操作进行限制 这里的基本思想是在内存中建立你确实想要的东西,然后更新DOM . 这并不是一个jQuery最佳实践,但必须进行有效的JavaScript操作 .直接的DOM操作速度很慢. 例如,你想动态的创建一组列表元素,千万不要这样做,如下所示: var top_100_list = [...], // 假设这里是100个独一无二的字符串 $mylist = $("#mylist"); // jQuery 选择到 <ul> 元素 for (var i=0,

  • MongoDb优化指南

    1.为什么选择MongoDB? 1.性能 在大数据时代中,大数据量的处理已经成了考量一个数据库最重要的原因之一.而MongoDB的一个主要目标就是尽可能的让数据库保持卓越的性能,这很大程度地决定了MongoDB的设计.在一个以传统机械硬盘为主导的年代,硬盘很可能会成为性能的短板,而MongoDB选择了最大程度而利用内存资源用作缓存来换取卓越的性能,并且会自动选择速度最快的索引来进行查询.MongoDB尽可能精简数据库,将尽可能多的操作交给客户端,这种方式也是MongoDB能够保持卓越性能的原因之

  • Android开发优化之Apk瘦身优化指南

    目录 了解APK结构 Android Size Analyzer 移除未使用的资源 启用资源缩减 (不打包) 动态库打包配置 总结 了解APK结构 在讨论如何缩减应用的大小之前,需要了解应用APK的结构.APK文件是由一个Zip压缩文件组成,其中包含构成应用的所有文件.其中包括Java类文件.资源文件及已编译资源的文件. APK 包含以下目录: META-INF/ :包含 CERT.SF 和 CERT.RSA 签名文件,以及 MANIFEST.MF 清单文件. assets/ :包含应用的资源:

  • IIS 网站服务器性能优化指南

    但配置.优化IIS的性能,使得网站访问性能达到最优状态却不是一件简单的事情,这里我就介绍一下如何一步一步的优化你的IIS服务器. 服务器端环境,我们以Windows Server 2003的IIS6.0为例,客户端环境为Mozilla Firefox 3.0,同时安装Yahoo的YSlow扩展. YSlow是Yahoo开发者团队发布的一款基于Firebug的插件.用于分析网页,并根据一些高性能网站的规则进行相应的评级打分,对于网页性能优化有很好的帮助作用,告诉你那些部分影响了你的网页速度,并告诉

  • java9的JShell小工具和编译器两种自动优化方法

    一.按顺序逐步执行的脚本程序: 二.编译器自动优化 1.不超数据类型范围编译器自动添加强转操作: 2.一但发生运算,byte/short/char都会自动提升为Int,当只有常量参与运算时,编译器会先斩后奏,将常量运算结果再进行赋值,因为常量不会变: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们.

  • WordPress网站性能优化指南

    1.选择一个好的主机 尽量不要使用免费主机或者共享主机(Godaddy啊.Bluehost啊等等所谓无限带宽.无限网站之类的主机) 首先,你的域名和你的主机最好在一个IDC哪儿,如果不是的话,建议你采用口碑良好的DNS服务商,让域名以最快的速度解析到主机上,这不是重点,重点是你的服务器/主机空间应该够快,怎么才能够快呢?CPU的配置.CPU的使用率.物理内存的大小.磁盘类型以及磁盘的I/O性能(包括Mysql数据库服务器所用磁盘).Mysql响应速度以及Mysql并发数等等,都会影响到网站的快与

  • Win2003 IIS6.0性能优化指南

    问:好多asp.net程序,放在一台服务器上,客户端连接使用一段时间后,在服务器上打开任务管理器一看,发现有很多w3wp.exe,占用内存很大,达到1g,请问为什么会这样?有什么办法可以避免这种情况呢? 答:这主要是你的ASP.NET 开发的程序有 内存泄漏;对于 非托管资源,一定要注意 释放. 问:我的具体情况是这样的: 服务器配置 至强2.8G 内存512M SCSI硬盘 2块 (软镜像) 系统 windows 2003 现在挂了一个asp.net开发的网站 访问量不大 但是出现一个 问题就

随机推荐