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

推荐订阅源

V2EX - 技术
V2EX - 技术
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Latest news
Latest news
T
The Exploit Database - CXSecurity.com
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
L
Lohrmann on Cybersecurity
aimingoo的专栏
aimingoo的专栏
B
Blog
T
Threat Research - Cisco Blogs
罗磊的独立博客
Application and Cybersecurity Blog
Application and Cybersecurity Blog
P
Proofpoint News Feed
P
Palo Alto Networks Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
宝玉的分享
宝玉的分享
博客园 - 司徒正美
Google DeepMind News
Google DeepMind News
Blog — PlanetScale
Blog — PlanetScale
T
Tor Project blog
阮一峰的网络日志
阮一峰的网络日志
Last Week in AI
Last Week in AI
Martin Fowler
Martin Fowler
酷 壳 – CoolShell
酷 壳 – CoolShell
Recorded Future
Recorded Future
D
DataBreaches.Net
Y
Y Combinator Blog
大猫的无限游戏
大猫的无限游戏
IT之家
IT之家
B
Blog RSS Feed
Scott Helme
Scott Helme
P
Proofpoint News Feed
V
Vulnerabilities – Threatpost
A
Arctic Wolf
Help Net Security
Help Net Security
L
LINUX DO - 最新话题
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Vercel News
Vercel News
AWS News Blog
AWS News Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
Schneier on Security
Hacker News: Ask HN
Hacker News: Ask HN
N
Netflix TechBlog - Medium
L
LangChain Blog
博客园 - 叶小钗
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
M
MIT News - Artificial intelligence
N
News and Events Feed by Topic
Webroot Blog
Webroot Blog
W
WeLiveSecurity

博客园 - 大约在冬季

如何在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%。
呵呵,差别惊人阿!