高并发、海量数据处理尽量少使用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这两个东西,我便稍显 ...
随机推荐
- mysql mHA manager 状态修改
启动:nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_fail ...
- DVDstore 数据库基准测试
1 DVDStore介绍 DVDstore 是一个电子商务测试应用,模拟多用户登陆在线系统,搜索DVD,购买DVD.多用来用作测试数据库性能或者其他的压力测试. 2 快速浏览测试步骤 (a) 安装数 ...
- Android addHeaderView和setAdapter的调用顺序后报错
在4.4之前的系统,setAdapter后再设置addHeaderView会爆 ListView想要添加headerview的话,就要通过addHeaderView这个方法,然后想要为ListView ...
- Android中NDK的搭建及简单使用 Android.mk相关介绍 JNI的使用
Android中NDK的搭建及简单使用: 使用NDK,简述其重要步骤:.搭建NDK环境(作用:用于自动生成jni下的.c对应的so文件)---到Android NDK官网或Android官网下载ndk ...
- Entity Framework EF6使用 MySql创建数据库异常解决办法
EF6使用MySQL数据库时,第一次创建数据库出现“Specified key was too long; max key length is 767 bytes”错误,解决办法请见以下连接. htt ...
- IO-04. 混合类型数据格式化输入(5)
本题要求编写程序,顺序读入浮点数1.整数.字符.浮点数2,再按照字符.整数.浮点数1.浮点数2的顺序输出. 输入格式: 输入在一行中顺序给出浮点数1.整数.字符.浮点数2,其间以1个空格分隔. 输出格 ...
- QQ在线客服设置
QQ在线客服设置 1.客户在添加QQ在线客服后,需要让用户在线不需要添加为好友就能在线对话,一般默认设置下会显示"您需要添加对方为好友+才能给对方发送会话消息",具体解决方法如下: ...
- velocity导出word报错解决
- 使用yum时,保留下载包设置
配置yum保留已经下载的rpm包,供以后升级或重新安装时使用.修改/etc/yum.conf[main]cachedir=/home/soft1/yumcachekeepcache=1debuglev ...
- lxc on centos
终于把lxc的网络配通了,也不知道对不对,记一下 一开始都是雷同的地方 yum install libcgroup lxc lxc-templates 安装lxc cgroup 然后记得 chkcon ...