惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
有赞技术团队
有赞技术团队
J
Java Code Geeks
H
Hackread – Cybersecurity News, Data Breaches, AI and More
美团技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Hugging Face - Blog
Hugging Face - Blog
人人都是产品经理
人人都是产品经理
酷 壳 – CoolShell
酷 壳 – CoolShell
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
Check Point Blog
博客园 - 【当耐特】
The GitHub Blog
The GitHub Blog
Recent Announcements
Recent Announcements
The Cloudflare Blog
Microsoft Azure Blog
Microsoft Azure Blog
腾讯CDC
Vercel News
Vercel News
IT之家
IT之家
MyScale Blog
MyScale Blog
博客园_首页
Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
罗磊的独立博客

博客园 - 大约在冬季

如何在IronPython中使用C#扩展方法 LINQ入门教程示例使用F#的实现 宝宝照片更新喽 再谈两种不同字符串比较方法的性能对比 - 大约在冬季 - 博客园 如何让DevExpress.TreeList单元格中的自定义控件包含标签 见证中国A股市场:上午大盘加速寻底 沪指跌129点,探低至4241.02 漂亮宝宝100天啦!庆祝一下! F# 学习笔记(1/n) 权重股杀跌沪指半日破两关跌135点 IronPyton分析表达式 WCF服务契约 听课笔记 最近性能优化一些感触,分享中…… .Net 事件类型的实现和推荐做法 设计时支持:如何获取环境数据 如何在C#中调用 IronPython 代码 (基于IronPython 2.0A3) 运行Oracle数据库配置向导创建数据库失败ORA-24324的解决方案 C#3.0 自动属性——只能在简单属性上偷懒 性能——换个角度看问题 设计模式的滋味
两种不同字符串比较方法的性能对比
大约在冬季 · 2007-08-16 · via 博客园 - 大约在冬季

最近比较关注C#书写出来的代码性能问题,越研究就越觉得很有意思。
在日常的编程过程总,由于编程需要,我们经常会比较两个字符串是否相等,然后再做相应的处理。代码书写起来是觉得很爽,不是吗?if (a==b) then ……else……但是有没有更快的方式呢?为此查阅了一些资料了MSDN文档。当我们调用 a==b的时候,通过IL代码可以看到内部实际上调用了String.Equals(string,string)这个方法

IL_0021:  call       bool [mscorlib]System.String::op_Equality(string,
                                                                 
string)
  IL_0026:  stloc.s    re

public static bool Equals(string a, string b)
{
    
if (a == b)
    
{
        
return true;
    }

    
if ((a != null&& (b != null))
    
{
        
return EqualsHelper(a, b);
    }

    
return false;
}


更为严重的是更底层调用的是EqualsHelper辅助方法,它首先比较两个字符串的长度,然后逐个字符的通过引用指针的方式进行比较,由于无法明确的区隔是否和语言别有关系,内部处理异常复杂。有没有更快速的方法呢?
答案是有的。
.Net 2.0中新增了一个StringComparison枚举类型,实际上我们大多数的字符串比较是和语言别无关的,我们应该使用Ordinal和OrdinalIgnoreCase两个枚举值。处于性能考虑,在字符串比较时不应该直接使用==操作符,而应该使用
bool Equals(string value, StringComparison comparisonType)
bool Equals(string a, string b, StringComparison comparisonType)
为此,我进行了一个测试,看看不等的==操作符和String.Equals方法之间的性能差别有多大。
测试代码:

 string a = "abcdefghigklmnopqrstuvwxyz0123456789!@#$%^&*()_+";
            
string b = "abcdefghigklmnopqrstuvwxyz0123456789!@#$%^&*()_+?";
            Stopwatch watch 
= new Stopwatch();
            watch.Start();
            
for (int i = 0; i < 90000000; i++{
              
bool re = a.Equals(b, StringComparison.OrdinalIgnoreCase);
            }

            watch.Stop();
            
double time = watch.Elapsed.TotalSeconds;
            Console.Write(time);
            Console.ReadLine();

测试了三次,分别为:1.1163117,1.106148,1.1041815
然后运行下面的代码:

  string a = "abcdefghigklmnopqrstuvwxyz0123456789!@#$%^&*()_+";
            
string b = "abcdefghigklmnopqrstuvwxyz0123456789!@#$%^&*()_+?";
            Stopwatch watch 
= new Stopwatch();
            watch.Start();
            
for (int i = 0; i < 90000000; i++{
                
bool re = (a == b);
            }

            watch.Stop();
            
double time = watch.Elapsed.TotalSeconds;
            Console.Write(time);
            Console.ReadLine();

测试了三次,分别为:1.6392576,1.6143791,1.6253847
算出平均值之后,两者在速度上相差46.675%。
呵呵,差别惊人阿!