请看下面两段:

第一种方式:

                MemoryStream stream = new MemoryStream();

          string text = "aasasdfasdfad;sas;fkqeworpkqwefkasdjfasdjf";
byte[] buff = System.Text.ASCIIEncoding.ASCII.GetBytes(text);
stream.Write(buff, , buff.Length);
stream.Flush();
stream.Close();
stream.Dispose();

第二种方式:

            string text = "aasasdfasdfad;sas;fkqeworpkqwefkasdjfasdjf";
using (MemoryStream stream = new MemoryStream())
{
byte[] buff = System.Text.ASCIIEncoding.ASCII.GetBytes(text);
stream.Write(buff, , buff.Length);
stream.Flush();
stream.Close();
}

不仅仅是我,估计一个老鸟程序员,大都会选择方法二,虽然方法一和方法二实现相同的功能,但是方法二带着套比较保险,即便我们失手,不会制造出垃圾来(这话听着怪怪的,能理解我在说什么就好)。之后,我在做一些消息处理机制的接收、处理、分发测试中,发现使用using关键字和不用using关键字,效率有着很大差异,不使用using关键字效率明显偏高,MQ队列占用明显偏小,这是为什么呢?答案马上揭晓。

以下是通过反汇编工具所得的中间语言(IL)

.method private hidebysig static void  Main(string[] args) cil managed
{
.entrypoint
// 代码大小 65 (0x41)
.maxstack
.locals init ([] string text,
[] class [mscorlib]System.IO.MemoryStream 'stream',
[] uint8[] buff)
IL_0000: nop
IL_0001: ldstr "aasasdfasdfad;sas;fkqeworpkqwefkasdjfasdjf"
IL_0006: stloc.
IL_0007: newobj instance void [mscorlib]System.IO.MemoryStream::.ctor()
IL_000c: stloc.
IL_000d: call class [mscorlib]System.Text.Encoding [mscorlib]System.Text.Encoding::get_ASCII()
IL_0012: ldloc.
IL_0013: callvirt instance uint8[] [mscorlib]System.Text.Encoding::GetBytes(string)
IL_0018: stloc.
IL_0019: ldloc.
IL_001a: ldloc.
IL_001b: ldc.i4.
IL_001c: ldloc.
IL_001d: ldlen
IL_001e: conv.i4
IL_001f: callvirt instance void [mscorlib]System.IO.Stream::Write(uint8[],
int32,
int32)
IL_0024: nop
IL_0025: ldloc.
IL_0026: callvirt instance void [mscorlib]System.IO.Stream::Flush()
IL_002b: nop
IL_002c: ldloc.
IL_002d: callvirt instance void [mscorlib]System.IO.Stream::Close()
IL_0032: nop
IL_0033: ldloc.
IL_0034: callvirt instance void [mscorlib]System.IO.Stream::Dispose()
IL_0039: nop
IL_0040: ret
} // end of method Program::Main

以上是方法一,所得中间语言,看起来非常干净、流畅。下面看看方法二的:

.method private hidebysig static void  Main(string[] args) cil managed
{
.entrypoint
// 代码大小 79 (0x4f)
.maxstack
.locals init ([] string text,
[] class [mscorlib]System.IO.MemoryStream 'stream',
[] uint8[] buff,
[3] bool CS$4$0000)
IL_0000: nop
IL_0001: ldstr "aasasdfasdfad;sas;fkqeworpkqwefkasdjfasdjf"
IL_0006: stloc.
IL_0007: newobj instance void [mscorlib]System.IO.MemoryStream::.ctor()
IL_000c: stloc.
.try

{
IL_000d: nop

IL_000e: call class [mscorlib]System.Text.Encoding [mscorlib]System.Text.Encoding::get_ASCII()
IL_0013: ldloc.
IL_0014: callvirt instance uint8[] [mscorlib]System.Text.Encoding::GetBytes(string)
IL_0019: stloc.
IL_001a: ldloc.
IL_001b: ldloc.
IL_001c: ldc.i4.
IL_001d: ldloc.
IL_001e: ldlen
IL_001f: conv.i4
IL_0020: callvirt instance void [mscorlib]System.IO.Stream::Write(uint8[],
int32,
int32)
IL_0025: nop
IL_0026: ldloc.
IL_0027: callvirt instance void [mscorlib]System.IO.Stream::Flush()
IL_002c: nop
IL_002d: ldloc.
IL_002e: callvirt instance void [mscorlib]System.IO.Stream::Close()
IL_0033: nop
IL_0034: nop
IL_0035: leave.s IL_0047

} // end .try
finally

{

IL_0037: ldloc.
IL_0038: ldnull
IL_0039: ceq
IL_003b: stloc.3
IL_003c: ldloc.3
IL_003d: brtrue.s IL_0046
IL_003f: ldloc.1

IL_0040: callvirt instance void [mscorlib]System.IDisposable::Dispose()
IL_0045: nop
IL_0046: endfinally
}
// end handler
IL_0047: pop
IL_0048: ret
} // end of method Program::Main

  第二段IL中间红色部分即为不同

[] bool  CS$$)
IL_000d: nop   停止几个时钟周期
IL_000d: nop
IL_0035: leave.s IL_0047 退出受保护的代码区域,无条件将控制转移到目标指令
IL_0038: ldnull 将空引用(O 类型)推送到计算堆栈上
IL_0039: ceq 比较两个值。如果这两个值相等,则将整数值 (int32) 推送到计算堆栈上;否则,将 (int32) 推送到计算堆栈上
IL_003b: stloc. 从计算堆栈的顶部弹出当前值并将其存储到索引 处的局部变量列表中
IL_003c: ldloc. 将索引 处的局部变量加载到计算堆栈上
IL_003d: brtrue.s IL_0046 如果 value 为 true、非空或非零,则将控制转移到目标指令
IL_003f: ldloc. 将索引 处的局部变量加载到计算堆栈上
IL_0045: nop
IL_0046: endfinally 将控制从异常块的 fault 或 finally 子句转移回公共语言结构 (CLI) 异常处理程序

IL指令汇总

  但是刚刚我们也提到了,虽然方法一和方法二实现相同的功能,但是方法二带着套比较保险,即便我们失手,不会制造出垃圾来。即使是你忘记使用.close()、.dispose()方法释放资源,using还是会自动帮你处理好你遗忘的的坏事。

  所以在一般不要求高效开发中,尽量使用using,但是在处理高并发、海量数据等等情况下,尽量不要让using出现。


提示:

  try..catch有一定的代码优化能力,少量代码测试,try..catch可能更优


 
 
 
 
 

高并发、海量数据处理尽量少使用using也能提升效率的更多相关文章

  1. HashSet非常的消耗空间,TreeSet因为有排序功能,因此资源消耗非常的高,我们应该尽量少使用

    注:HashMap底层也是用数组,HashSet底层实际上也是HashMap,HashSet类中有HashMap属性(我们如何在API中查属性).HashSet实际上为(key.null)类型的Has ...

  2. 【高并发】ReadWriteLock怎么和缓存扯上关系了?!

    写在前面 在实际工作中,有一种非常普遍的并发场景:那就是读多写少的场景.在这种场景下,为了优化程序的性能,我们经常使用缓存来提高应用的访问性能.因为缓存非常适合使用在读多写少的场景中.而在并发场景中, ...

  3. 海量用户-高并发SAAS产品测试上线流程

    海量用户高并发SAAS产品测试上线流程 SAAS产品测试上线流程-以Web插件产品为例子 1   概述 在互联网产品中,IT公司之间更加注重产品功能之间的协作,SAAS形态的产品扮演着越来越重要的作用 ...

  4. PHP的高并发和大数据处理

    收集前人的经验.加速学习,解决工作中的难题. 一.代码优化(包括sql语句的优化), 合理的使用索引,避免整表查询.二.日常海量数据处理我用文件缓存,文件缓存分两种,第一种是最常见的生成html静太文 ...

  5. C++高并发场景下读多写少的解决方案

    C++高并发场景下读多写少的解决方案 概述 一谈到高并发的解决方案,往往能想到模块水平拆分.数据库读写分离.分库分表,加缓存.加mq等,这些都是从系统架构上解决.单模块作为系统的组成单元,其性能好坏也 ...

  6. C++高并发场景下读多写少的优化方案

    概述 一谈到高并发的优化方案,往往能想到模块水平拆分.数据库读写分离.分库分表,加缓存.加mq等,这些都是从系统架构上解决.单模块作为系统的组成单元,其性能好坏也能很大的影响整体性能,本文从单模块下读 ...

  7. 由 12306.cn 谈谈高并发+高负载网站性能技术

    12306.cn 网站挂了,被全国人民骂了.我这两天也在思考这个事,我想以这个事来粗略地和大家讨论一下网站性能的问题.因为仓促,而且完全基于本人有限的经验和了解, 所以,如果有什么问题还请大家一起讨论 ...

  8. 构建高性能高并发Java系统 .

    转:http://blog.csdn.net/nengyu/article/details/7591854 场景这里指的高性能高并发服务器是一个有状态的服务,可以理解成web或者socket服务器,每 ...

  9. 从hadoop框架与MapReduce模式中谈海量数据处理

    http://blog.csdn.net/wind19/article/details/7716326 前言 几周前,当我最初听到,以致后来初次接触Hadoop与MapReduce这两个东西,我便稍显 ...

随机推荐

  1. java 单利模式

    首先何为单利模式: 单利模式即多次调用同一个对象的时候,只有一个实例(这里所谓的实例就是,假如创建了两个对象,它们的hashCode相同) 下面是相关代码: 1 创建一个对象Singleton类 pa ...

  2. 为什么一个类的全局变量默认以m开头?

    某天闲着无聊,突然想起来为什么大家都习惯将全局变量使用m开头,于是追根求源,查了一些资料,虽然并不是我想要的,但是也总结一下. 在stackoverflow上就有人问: Why do most var ...

  3. 多清楚的IO 表

  4. BZOJ2683 简单题(CDQ分治)

    传送门 之前听别人说CDQ分治不难学,今天才知道果真如此.之前一直为自己想不到CDQ的方法二很不爽,今天终于是想出来了一道了,太弱-- cdq分治主要就是把整段区间分成两半,然后用左区间的值去更新右区 ...

  5. 百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换(JS版代码)

    /** * Created by Wandergis on 2015/7/8. * 提供了百度坐标(BD09).国测局坐标(火星坐标,GCJ02).和WGS84坐标系之间的转换 */ //定义一些常量 ...

  6. ios申请真机调试( xcode 5)详细解析

    已经有开发证书的直接跳过第一步 第一步:申请"开发证书" 进入苹果开发者99美元账号: 选择:Certificates, Identifiers & Profiles 关于 ...

  7. iOS navigationcontroller pop 回到上一层视图 如何刷新

    1.从视图A中navigation controller push到视图B,当视图B navigationcontroller pop回到视图A时,并不会调用A的viewDidLoad,但是会调用vi ...

  8. HDOJ 4749 Parade Show

    说实在的在比赛时看错了题意,一直对最后一段的描述不是很清楚.闲话少说: 题意:给一个主串,再一个副串,问主串中有多少个子串和副串的的规律相同,即相邻的相等大于小于,用过的就不能再用了. #includ ...

  9. 如何让ECSHOP不同的分类调用不同模板方法

    如何给ecshop商品分类,显示不同的模板的话.可以通过不同的分类ID来取得不同模板.我们可以通过分类ID来判断,比如分类为1的,调用cat1.dwt.分类为2的,调用cat2.dwt,我们在cate ...

  10. 【C++】自绘控件基础

    由于我们对控件的功能.外观的需求,公共控件并不能很好地满足这一点,所以我们就得自绘控件. 自绘控件有许多方法,比如:处理WM_PAINT消息,设置ownDraw风格,处理WM_CTLCOLOR消息,等 ...