高并发、海量数据处理尽量少使用using也能提升效率
请看下面两段:
第一种方式:
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) 异常处理程序
但是刚刚我们也提到了,虽然方法一和方法二实现相同的功能,但是方法二带着套比较保险,即便我们失手,不会制造出垃圾来。即使是你忘记使用.close()、.dispose()方法释放资源,using还是会自动帮你处理好你遗忘的的坏事。
所以在一般不要求高效开发中,尽量使用using,但是在处理高并发、海量数据等等情况下,尽量不要让using出现。
提示:
try..catch有一定的代码优化能力,少量代码测试,try..catch可能更优
高并发、海量数据处理尽量少使用using也能提升效率的更多相关文章
- HashSet非常的消耗空间,TreeSet因为有排序功能,因此资源消耗非常的高,我们应该尽量少使用
注:HashMap底层也是用数组,HashSet底层实际上也是HashMap,HashSet类中有HashMap属性(我们如何在API中查属性).HashSet实际上为(key.null)类型的Has ...
- 【高并发】ReadWriteLock怎么和缓存扯上关系了?!
写在前面 在实际工作中,有一种非常普遍的并发场景:那就是读多写少的场景.在这种场景下,为了优化程序的性能,我们经常使用缓存来提高应用的访问性能.因为缓存非常适合使用在读多写少的场景中.而在并发场景中, ...
- 海量用户-高并发SAAS产品测试上线流程
海量用户高并发SAAS产品测试上线流程 SAAS产品测试上线流程-以Web插件产品为例子 1 概述 在互联网产品中,IT公司之间更加注重产品功能之间的协作,SAAS形态的产品扮演着越来越重要的作用 ...
- PHP的高并发和大数据处理
收集前人的经验.加速学习,解决工作中的难题. 一.代码优化(包括sql语句的优化), 合理的使用索引,避免整表查询.二.日常海量数据处理我用文件缓存,文件缓存分两种,第一种是最常见的生成html静太文 ...
- C++高并发场景下读多写少的解决方案
C++高并发场景下读多写少的解决方案 概述 一谈到高并发的解决方案,往往能想到模块水平拆分.数据库读写分离.分库分表,加缓存.加mq等,这些都是从系统架构上解决.单模块作为系统的组成单元,其性能好坏也 ...
- C++高并发场景下读多写少的优化方案
概述 一谈到高并发的优化方案,往往能想到模块水平拆分.数据库读写分离.分库分表,加缓存.加mq等,这些都是从系统架构上解决.单模块作为系统的组成单元,其性能好坏也能很大的影响整体性能,本文从单模块下读 ...
- 由 12306.cn 谈谈高并发+高负载网站性能技术
12306.cn 网站挂了,被全国人民骂了.我这两天也在思考这个事,我想以这个事来粗略地和大家讨论一下网站性能的问题.因为仓促,而且完全基于本人有限的经验和了解, 所以,如果有什么问题还请大家一起讨论 ...
- 构建高性能高并发Java系统 .
转:http://blog.csdn.net/nengyu/article/details/7591854 场景这里指的高性能高并发服务器是一个有状态的服务,可以理解成web或者socket服务器,每 ...
- 从hadoop框架与MapReduce模式中谈海量数据处理
http://blog.csdn.net/wind19/article/details/7716326 前言 几周前,当我最初听到,以致后来初次接触Hadoop与MapReduce这两个东西,我便稍显 ...
随机推荐
- React Native填坑之旅--组件生命周期
这次我们来填React Native生命周期的坑.这一点非常重要,需要有一个清晰的认识.如果你了解Android或者iOS的话,你会非常熟悉我们今天要说的的内容. 基本上一个React Native的 ...
- myeclipse使用maven插件进行maven install时报错check $m2_home environment variable and mvn script match
check $m2_home environment variable and mvn script match 分类: maven2015-09-01 18:06 842人阅读 评论(0) 收藏 举 ...
- 用wordpress搭建个人博客
一.安装WordPress所需的开发环境. 1.安装apache yum install httpd 2.安装mysql 可参照我的另一篇文章:http://www.cnblogs.com/kings ...
- [转] How to Show Usual Winform as View in XAF
How to Show Usual Winform as View in XAF http://www.codeproject.com/Tips/464188/How-to-Show-Usual-Wi ...
- 【整理】--【GPIO】OK6410
S3C6410的GPIO引脚相对来说比较多,而且大部分引脚都具有多重复用功能,如何在linux上用最简单的方式来控制GPIO这需要我们好好研究一下底层的代码了,其实方法有很多种,鉴于在操作系统端控制G ...
- (一)读取PCD文件
下面是一个简单的读取PCD文件并显示的代码: #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/p ...
- 【C++】自绘控件基础
由于我们对控件的功能.外观的需求,公共控件并不能很好地满足这一点,所以我们就得自绘控件. 自绘控件有许多方法,比如:处理WM_PAINT消息,设置ownDraw风格,处理WM_CTLCOLOR消息,等 ...
- ABP框架详解(七)Caching
在ABP框架中存在一个缓存机制,使用ICache的继承类来存储最终需要缓存的数据,可以吧ICache看成一个字典对象,使用Key作为真实数据的具有唯一性的表示.使用上与字典对象完全相同,Get方法传递 ...
- <2048>游戏问卷调查心得与体会
这是我的首次做问卷调查,刚开始感到不知所措,不知道该怎么去完成它,但是其中也充满了所谓的新鲜感,以前总是填别人做的问卷调查,但是现在是我们小组自己讨论得到的一张属于自己的问卷,可以说感受很深,一张小小 ...
- Yii2中的环境配置
默认的Debug配置 在入口文件中 defined ( 'YII_DEBUG' ) or define ( 'YII_DEBUG', true ); defined ( 'YII_ENV' ) or ...