提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|其它|编辑:郝浩|2009-05-14 10:29:10.000|阅读 725 次
概述:写的一篇关于字符串为空判断方法的性能分析文章,实验结果作者已经给出,结论是使用.length==0判断的效率最高,但是文章的结尾只有一句话,感觉不够详细,所以自己写下这个文章,算一个补充和学习吧.
#慧都22周年庆大促·界面/图表报表/文档/IDE/IOT/测试等千款热门软控件火热促销中>>
偶然看到<C#中判断空字符串的3种方法性能分析 >作者:清清月儿 主页: 时间:2007.4.28
写的一篇关于字符串为空判断方法的性能分析文章,实验结果作者已经给出,结论是使用.length==0判断的效率最高,但是文章的结尾只有一句话,感觉不够详细,所以自己写下这个文章,算一个补充和学习吧.
程序代码执行的硬件环境:
|
CPU |
Intel T2300 1.66GHz |
|
内存 |
Kingston DDR2 667 1G |
|
硬盘 |
80G 5400转 8m |
测试的软件环境:
|
OS |
Windows XP Pro |
|
IDE |
VS 2008 RTM |
测试的代码如下:
定义了3个变量,分别调用4种方法,进行100w次判断,记录测试时间:
Stopwatch sw = new Stopwatch();//实例化一个对象,记录时间
string sEmpty1 = string.Empty;//实例化3个字符串对象,赋值如下。分别作空比较试验
string sEmpty2 = "";
string sEmpty3 = "StringNotEmpty";
/**/////////////////////////////////////////////////////Test sEmpty1///////////////////////////
sw.Start();//开始记录
for (int i = 0; i <= 1000000; i++)
{
if (sEmpty1.Length == 0) 
{ }
}
sw.Stop();//停止记录时间
Console.WriteLine("string.Empty Length == 0 Time Cost is {0}", sw.ElapsedMilliseconds);
/**/////////
sw.Reset();//重置计数器为0;
sw.Start();
for (int i = 0; i <= 1000000; i++)
{
if (sEmpty1 == "")
{ }
}
sw.Stop();
Console.WriteLine("string.Empty == \"\" Time Cost is {0}", sw.ElapsedMilliseconds);
/**/////
sw.Reset();
sw.Start();
for (int i = 0; i <= 1000000; i++)
{
if (sEmpty1 == string.Empty) 
{ }
}
sw.Stop();
Console.WriteLine("string.Empty == string.Empty Time Cost is {0}", sw.ElapsedMilliseconds);
sw.Reset();
sw.Start();
for (int i = 0; i <= 1000000; i++)
{
if(string.IsNullOrEmpty(sEmpty1))
{}
}
sw.Stop();
Console.WriteLine("string.IsNullOrEmpty Time Cost is {0}", sw.ElapsedMilliseconds);
Console.WriteLine();
/**/////////////////////////////////////////////////////Test sEmpty2///////////////////////////
sw.Reset();
sw.Start();
for (int i = 0; i <= 1000000; i++)
{
if(sEmpty2.Length == 0)
{}
}
sw.Stop();
Console.WriteLine("\"\" Length == 0 Time Cost is {0}", sw.ElapsedMilliseconds);
/**/////////
sw.Reset();
sw.Start();
for (int i = 0; i <= 1000000; i++)
{
if(sEmpty2 == "")
{}
}
sw.Stop();
Console.WriteLine("\"\" == \"\" Time Cost is {0}", sw.ElapsedMilliseconds);
/**//////
sw.Reset();
sw.Start();
for (int i = 0; i <= 1000000; i++)
{
if(sEmpty2 == string.Empty)
{}
}
sw.Stop();
Console.WriteLine("\"\" == string.Empty Test3 Time Cost is {0}", sw.ElapsedMilliseconds);
/**//////
sw.Reset();
sw.Start();
for (int i = 0; i <= 1000000; i++)
{
if(string.IsNullOrEmpty(sEmpty2))
{}
}
sw.Stop();
Console.WriteLine("\"\" string.IsNullOrEmpty Time Cost is {0}", sw.ElapsedMilliseconds);
Console.WriteLine();
/**/////////////////////////////////////////////////////Test sEmpty3///////////////////////////
sw.Reset();
sw.Start();
for (int i = 0; i <= 1000000; i++)
{
if(sEmpty3.Length == 0)
{}
}
sw.Stop();
Console.WriteLine("\"StringNotEmpty\" Length == 0 Time Cost is {0}", sw.ElapsedMilliseconds);
/**/////////
sw.Reset();
sw.Start();
for (int i = 0; i <= 1000000; i++)
{
if(sEmpty3 == "")
{}
}
sw.Stop();
Console.WriteLine("\"StringNotEmpty\" == \"\" Time Cost is {0}", sw.ElapsedMilliseconds);
/**/////
sw.Reset();
sw.Start();
for (int i = 0; i <= 1000000; i++)
{
if(sEmpty3 == string.Empty)
{}
}
sw.Stop();
Console.WriteLine("\"StringNotEmpty\" == string.Empty Test3 Time Cost is {0}", sw.ElapsedMilliseconds);
/**/////
sw.Reset();
sw.Start();
for (int i = 0; i <= 1000000; i++)
{
if(string.IsNullOrEmpty(sEmpty3))
{}
}
sw.Stop();
Console.WriteLine("\"StringNotEmpty\" IsNullOrEmpty Time Cost is {0}", sw.ElapsedMilliseconds);
代码的运行结果如下:
结果分析来看,调用string的length==0作比较,不论字符串是否为空,此方法的效率最高,此点与清清月儿的结果一致;
string的isNullOrEmpty()方法的效率基本不变,无论字符串是否有值;
== string.Empty和== ""两种方法在3个变量测试的实验中效率相对较低,但是两者再和对方比较的时候会出现效率降低的情况,见上图;
原因是什么呢?我们来看看对应的il代码:
.locals init ([0] class [System]System.Diagnostics.Stopwatch sw,
[1] string sEmpty1,
[2] string sEmpty2,
[3] string sEmpty3,
[4] int32 i,
[5] bool CS$4$0000)
IL_0000: nop
IL_0001: newobj instance void [System]System.Diagnostics.Stopwatch::.ctor()
IL_0006: stloc.0
IL_0007: ldsfld string [mscorlib]System.String::Empty//将指定字段的值推送到堆栈上。 ldsfld 指令将静态(在类的所有实例中共享)字段的值推送到堆栈上。返回类型是与传递的元数据标记 field 关联的类型。
IL_000c: stloc.1
IL_000d: ldstr ""//将对字符串的对象引用推送到堆栈上,ldstr 指令推送对表示在元数据中存储的特定字符串的新字符串对象的对象引用(O 类型)。
IL_0012: stloc.2
IL_0013: ldstr "StringNotEmpty"//将对字符串的对象引用推送到堆栈上,ldstr 指令推送对表示在元数据中存储的特定字符串的新字符串对象的对象引用(O 类型)。
IL_0018: stloc.3
IL_0019: ldloc.0
两者的差别由于推送到堆栈上的内容不同,前者是静态共享值推送到堆栈,后者是字符串对象的地址推送到堆栈.
造成的比较差别.另外字符串值是否相等的资料大家可以看看园子里缘清的文章,有很好的参考价值.地址:.希望大家一起交流!
谢谢!~
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@hmdbvip.cn
文章转载自:博客园



接DevExpress原厂商通知,将于近日上调旗下产品授权价格,现在下单客户可享受优惠报价!
面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@hmdbvip.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
永利最大(官方)网站