高并发、海量数据处理尽量少使用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这两个东西,我便稍显 ...
随机推荐
- C++builder中使用TScrollBox 以后,让scrollBox相应鼠标的上下滑动
1.在窗口的事件里搜索 mouseWheel的方法 2.在.cpp文件里实现下面的代码 void __fastcall TForm1::mouseWheel(TObject *Sender, TShi ...
- python socket server源码学习
原文请见:http://www.cnblogs.com/wupeiqi/articles/5040823.html 这里就是自己简单整理一下: #!/usr/bin/env python # -*- ...
- PYTHON学习之路_PYTHON基础(1)
学习内容: 1.Python介绍 2.Python程序初接触和变量 3.Python用户交互 4.Python数据类型 5.Python循环if...(elif)...else 6.Python循环w ...
- 好玩儿的Game
1. 种类: 威佐夫游戏, Bash游戏, Nim游戏, 等. 2. 理论: 胜态一定可以通过某种策略走向必败态; 而必败态采取任何策略都将走向胜态. 用图论的话来说, 因为必败态只能走向胜态, 所以 ...
- [转] How to change font settings for all UI elements (toolbar and context menus, property editors, etc.)
https://www.devexpress.com/Support/Center/Question/Details/S35762
- DedeCMS织梦系统head.htm里无法调用栏目描述
{dede:channel type='top'} [field:description/] {/dede:channel} channel 这个标签没有description属性你需要自己把这个属性 ...
- android开发中监控android软件网络请求的软件Charles使用入门
1.下载并安状软件,官网在此: http://www.charlesproxy.com/ 2.前题条件,电脑和手机必须在同一网段 3.在Charles界面选择菜单 proxy->proxy se ...
- 树莓派安装RASPBIAN系统
买了个树莓派3B,安装Raspbian时出现问题,能ping通,但是无法建立ssh链接!对于我这种只有网线和电源的玩家来说打击太大. 找了一下原因,如下链接所述: http://downloads.r ...
- 决策树 -- C4.5算法
C4.5是另一个分类决策树算法,是基于ID3算法的改进,改进点如下: 1.分离信息 解释:数据集通过条件属性A的分离信息,其实和ID3中的熵: 2.信息增益率 解释:Gain(A)为获的A ...
- 百度ueditor 实例化 Cannot set property 'innerHTML' of null 完美解决方案
此时此刻,我正在用博客园推荐的TinyMCE编辑器写这个博客,突然想起最近在项目中使用百度ueditor编辑器中的一些经历.所以记录在此,与大家分享. 不得不说,百度ueditor是一款很好的在线编辑 ...