最近比较关注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%。
呵呵,差别惊人阿!

转载于:https://www.cnblogs.com/DreamWinter/archive/2007/08/16/858095.html

两种不同字符串比较方法的性能对比相关推荐

  1. js两种拼接字符串方法

    js两种拼接字符串方法 function(msgArr) {//参数为一个数组,每一个对象为图片id和图片地址var len = msgArr.length;//第一种拼接方式,直接用"+& ...

  2. python中如何连接两个字符串_python中5种连接字符串的方法

    字符串是Python中常用的数据类型,在开发过程中可以对字符创进行截取并与其他字符创进行连接.本文为大家介绍了5种连接字符串的方法. 1.加号 如果有其他编程语言开发经验的人,肯定知道很多语言里面是用 ...

  3. PHP生成随机密码的4种方法及性能对比

    PHP生成随机密码的4种方法及性能对比 http://www.php100.com/html/it/biancheng/2015/0422/8926.html 来源:露兜博客   时间:2015-04 ...

  4. 一文带你了解两种Transformer文字识别方法

    摘要:受Transformer模型的启发,目前一些学者将该结构应用到文本行识别中,以替代RNN,取得了良好的效果,如在HGA-STR和 SRN. 当前的文本行识别器为拥有更强的序列语义能力,模型多采用 ...

  5. golang java rpc_golang两种调用rpc的方法

    本文实例讲述了golang两种调用rpc的方法.分享给大家供大家参考,具体如下: golang的rpc有两种方法进行调用,一种是rpc例子中给的: package main import ( &quo ...

  6. 英雄无敌6服务器在哪个文件夹,Win7系统无法运行英雄无敌6的两种原因和解决方法...

    英雄无敌6作为一款策略模拟类游戏,深受高端玩家的喜爱.但最近有Win7旗舰版系统用户在玩英雄无敌6时,却出现了无法运行的情况,重启好多次还是一样,不太清楚是哪里出问题,网上相关解决方案也比较少,针对此 ...

  7. 两种ps切图方法(图层/切片)

    两种Ps切图方法 一.      基础操作: a)    Ctrl++ 放大图片,ctrl - -缩小图片 b)    按住空格键space+,点击鼠标左键,拖动图片. c)    修改单位,点击编辑 ...

  8. 归一化mysql函数_数据归一化和两种常用的归一化方法

    数据归一化和两种常用的归一化方法 一.总结 一句话总结: min-max标准化:x* =(x-min)/(max-min):新数据加入,需重新计算max和min Z-score标准化:x* =(x-μ ...

  9. win7 计算机名称 ip6,Win7系统提示ipv6无网络访问权限的两种原因及解决方法

    Win7系统提示ipv6无网络访问权限,导致无法上网,这该如何解决呢?ipv6无网络访问权限的原因有很多种,针对此问题,下面脚本之家的教大家解决ipv6无网络访问权限的问题,大家一起来看看吧. 故障原 ...

最新文章

  1. 企业服务内部接口校验方案
  2. c语言一段字符加密,请问C语言怎么实现对一长串字符进行MD5加密?
  3. C++需要输出一个参数的地址时可能达不到预期的效果
  4. 第七篇:Spring Boot整合Thymeleaf_入门试炼02
  5. 项响琴C语言书籍在线浏览,电子琴 c语言程序
  6. Mr.J--JavaScript-恶搞小代码
  7. Cracer8-模块和正则表达式
  8. Linux Linux常用命令二
  9. Docker 安装solr 配置IK分词,说明
  10. 自己编写错误代码的规范
  11. ESP8266 NonOS-SDK Web配网
  12. C语言 —— 存储类相关的关键字 (持续更新中....)
  13. style = “color:####“包含的颜色名称对照表
  14. 7-3 sdust-Java-字符串集合求并集 (25 分)
  15. 给出n个数,找出这n个数的最大,最小,和值
  16. dds:core:policy
  17. tiny4412 裸机程序 六、重定位代码到IRAM+0x8000【转】
  18. 铃铛子训练营 | 我的感悟(二)
  19. linux关机重启机器人,Linux Stopped (tty output) 问题
  20. [11.02] 猴猴吃香蕉

热门文章

  1. C语言快速学习笔记001-相关语法
  2. 网站制作---网站伪静态的介绍
  3. XGBoost原理及在Python中使用XGBoost
  4. 杭电4508湫湫系列故事——减肥记I
  5. visual studio 2017搭建linux c++开发环境
  6. 利用mysql数据库中_利用mysql和mysqli取得mysql的所有数据库和库中的所有表
  7. php new static,PHP 的 new static 和 new self
  8. 三相锁相 c 语言 程序,轻松玩转DSP——基于TMS320F2833x(Word+PDF+ePub+PPT)
  9. python3和python2的优劣_python2和python3的区别
  10. oracle禁用ctss,CTSS服务介绍及模式调整