高并发、海量数据处理尽量少使用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这两个东西,我便稍显 ...
随机推荐
- 第十三章:降维:主成分分析PCA
- Microsoft.Office.Interop.Excel 程序集引用 ,Microsoft.Office.Interop.Excel.ApplicationClass 无法嵌入互操作类型
using Microsoft.Office.Interop.Excel 添加程序集引用 方法:在引用--程序集--扩展中,添加引用Microsoft.Office.Interop.Excel,此 ...
- Mini projects #3 ---- Stopwatch: The Game
课程全名:An Introduction to Interactive Programming in Python,来自 Rice University 授课教授:Joe Warren, Scott ...
- MySql数据源配置
1.tomcat的config/server.xml中将以下代码写到 </Host>前: <Context docBase="struts1" path=&quo ...
- 解剖SQLSERVER 第六篇 对OrcaMDF的系统测试里避免regressions(译)
解剖SQLSERVER 第六篇 对OrcaMDF的系统测试里避免regressions (译) http://improve.dk/avoiding-regressions-in-orcamdf-b ...
- 【AspNetCore】【WebApi】扩展Webapi中的RouteConstraint中,让DateTime类型,支持时间格式化(DateTimeFormat)
扩展Webapi中的RouteConstraint中,让DateTime类型,支持时间格式化(DateTimeFormat) 一.背景 大家在使用WebApi时,会用到DateTime为参数,类似于这 ...
- java 多线程(ThreadPoolExecutor (补充))
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; impo ...
- Ubuntu Desktop基本办公环境搭建
Ubuntu Desktop基本办公环境搭建 一如前面所强调的, linux系统是面向开发人员友好的,而对office办公人员并不友好 . 如果是重度的office办公需求人员,不建议使用linux ...
- ngModel 值不更新/显示
angular中的$scope是页面(view)和数据(model)之间的桥梁,它链接了页面元素和model,也是angular双向绑定机制的核心. 而ngModel是angular用来处理表单(fo ...
- HTML5 history API实践
一.history API知识点总结 在HTML4中,我们已经可以使用window.history对象来控制历史记录的跳转,可以使用的方法包括: history.forward();//在历史记录中前 ...