.net中的字符串操作性能问题由来已久,幸运的是微软推出了span<T>高性能指针操作封装工具类。这个类到底有多高的性能呢?网上传言反正很高,但是实际上在网上很难找到合适的测试实例,这让本人实在无力吐槽。经不住高性能这三个字的诱惑,本人还是了解了一番后做了几个简单样例来测试一番,下面列出几种字符串常见操作的测试代码及其运行结果。

一、String.Index 测试

             var t1 = StopWacherHelper.DoTimer(() =>
{
for (int i = ; i < count; i++)
{
str.IndexOf(subStr);
}
}); Console.WriteLine($"string.IndexOf {count} 次用时:{t1} 毫秒");
             var t2 = StopWacherHelper.DoTimer(() =>
{
var strSpan = str.AsSpan(); var subStrSpan = subStr.AsSpan(); for (int i = ; i < count; i++)
{
strSpan.IndexOf(subStrSpan);
}
}); Console.WriteLine($"Span<T>.IndexOf {count} 次用时:{t2} 毫秒");

二、String.Substring 测试

             var t1 = StopWacherHelper.DoTimer(() =>
{
for (int i = ; i < count; i++)
{
str.Substring(, str.IndexOf(subStr));
}
}); Console.WriteLine($"String.Substring {count} 次用时:{t1} 毫秒");
             var t2 = StopWacherHelper.DoTimer(() =>
{
var strSpan = str.AsSpan(); var subStrSpan = subStr.AsSpan(); var index = strSpan.IndexOf(subStrSpan); for (int i = ; i < count; i++)
{
strSpan.Slice(, strSpan.IndexOf(subStrSpan));
}
});

三、String.Split 测试

             var t1 = StopWacherHelper.DoTimer(() =>
{
for (int i = ; i < count; i++)
{
var arr = str.Split(new string[] { splitStr }, StringSplitOptions.None);
}
}); Console.WriteLine($"String.Split {count} 次用时:{t1} 毫秒");
             var t2 = StopWacherHelper.DoTimer(() =>
{
var strSpan = str.AsSpan(); var splitSapn = splitStr.AsSpan(); int m = , n = ; for (int i = ; i < count; i++)
{
List<string> arr = new List<string>(); while (true)
{
m = n;
n = strSpan.IndexOf(splitSapn);
if (n > -)
{
arr.Add(strSpan.Slice(, n).ToString());
strSpan = strSpan.Slice(n + splitSapn.Length);
}
else
{
break;
}
} }
}); Console.WriteLine($"Span<T>.Split {count} 次用时:{t2} 毫秒");

四、String.Replace 测试

             var t1 = StopWacherHelper.DoTimer(() =>
{
for (int i = ; i < count; i++)
{
str.Replace(splitStr, replaceStr);
}
}); Console.WriteLine($"String.Replace {count} 次用时:{t1} 毫秒");
             var t2 = StopWacherHelper.DoTimer(() =>
{
var strSpan = str.AsSpan(); var splitSapn = splitStr.AsSpan(); int m = , n = ; for (int i = ; i < count; i++)
{
List<string> arr = new List<string>(); while (true)
{
m = n;
n = strSpan.IndexOf(splitSapn);
if (n > -)
{
arr.Add(strSpan.Slice(, n).ToString());
strSpan = strSpan.Slice(n + splitSapn.Length);
}
else
{
break;
}
}
string.Join(replaceStr, arr);
}
}); Console.WriteLine($"Span<T>.Replace {count} 次用时:{t2} 毫秒");

  怎么样,经过上面的测试,是不是觉的Span<T>确实是名不虚传?的确,在上面几个常见场景中,Span<T>的高性能确实不同凡响,差不多是10倍的性能优势!看到这里,小伙伴们是不是觉的字符串操作全改成Span<T>就行了?那下面的两个测试会让大家看清现实,在String.Contains中表现还不如原生的。

一、String.Contains 测试

             var t1 = StopWacherHelper.DoTimer(() =>
{
for (int i = ; i < count; i++)
{
str.Contains(subStr);
}
}); Console.WriteLine($"string.Contains {count} 次用时:{t1} 毫秒");
             var t2 = StopWacherHelper.DoTimer(() =>
{
var strSpan = str.AsSpan(); var subStrSpan = subStr.AsSpan(); for (int i = ; i < count; i++)
{
strSpan.Contains(subStrSpan, StringComparison.CurrentCulture);
}
}); Console.WriteLine($"Span<T>.Contains {count} 次用时:{t2} 毫秒");

  仔细一看,不对啊,Span<T>的Contains里面有其它的大小写和语言相关的判断啊。好,那再换一个原生方法对比测试一下。

二、String.Compare 测试

             var t1 = StopWacherHelper.DoTimer(() =>
{
for (int i = ; i < count; i++)
{
string.Compare(str, subStr, true);
}
}); Console.WriteLine($"string.Compare {count} 次用时:{t1} 毫秒");
             var t2 = StopWacherHelper.DoTimer(() =>
{
var strSpan = str.AsSpan(); var subStrSpan = subStr.AsSpan(); for (int i = ; i < count; i++)
{
strSpan.Contains(subStrSpan, StringComparison.CurrentCultureIgnoreCase);
}
}); Console.WriteLine($"Span<T>.Contains {count} 次用时:{t2} 毫秒");

  还是被反杀了,这说明Span<T>的这个Contains方法可能真的只能在某些地方才能用,不然性能反而会有所下降。

如果对上述感兴趣,可以点击这里下载测试源码,更多请点击左下角的推荐,谢谢~

span<T>之高性能字符串操作实测的更多相关文章

  1. 如何使用T-SQL备份还原数据库及c#如何调用执行? C#中索引器的作用和实现。 jquery控制元素的隐藏和显示的几种方法。 localStorage、sessionStorage用法总结 在AspNetCore中扩展Log系列 - 介绍开源类库的使用(一) span<T>之高性能字符串操作实测

    如何使用T-SQL备份还原数据库及c#如何调用执行? 准备材料:Microsoft SQL Server一部.需要还原的bak文件一只 一.备份 数据库备份语句:user master backup ...

  2. 【超值分享】为何写服务器程序需要自己管理内存,从改造std::string字符串操作说起。。。

    服务器程序为何要进行内存管理,管中窥豹,让我们从string字符串的操作说起...... new/delete是用于c++中的动态内存管理函数,而malloc/free在c++和c中都可以使用,本质上 ...

  3. Python数据科学手册-Pandas:向量化字符串操作、时间序列

    向量化字符串操作 Series 和 Index对象 的str属性. 可以正确的处理缺失值 方法列表 正则表达式. Method Description match() Call re.match() ...

  4. 如何手动实现C语言中的字符串操作

    学了字符串操作,很多人也许学了大概知道怎么用,但是太久没用就忘了,恰恰这是找软件工程师或者嵌入式工程师以及C,C++相关的笔试面试必考的题目!接下来我们来看看如何手动实现这些相关的函数. 废话不多说, ...

  5. 第三章 JQuery: HelloWorld--常见方法--css--选择器--筛选器--属性--效果--事件--数组操作--字符串操作--对象转换

    1.jQuery简介 为了简化JavaScript 的开发, 一些JavsScript 库诞生了. JavaScript库封装了很多预定义的对象和实用函数.能帮助使用者建立有高难度交互的页面, 并且兼 ...

  6. C的字符串操作接口实现

    近期在写一个关于用HTTP控制storm的的UI功能.已经实现完毕,採用在nginx里面增加相应的模块调用来实现,模块中调用一个动态载入的SO.这个SO用THRIFT和zookeeper client ...

  7. 一句python,一句R︱python中的字符串操作、中文乱码、NaN情况

    一句python,一句R︱python中的字符串操作.中文乱码.NaN情况 先学了R,最近刚刚上手Python,所以想着将python和R结合起来互相对比来更好理解python.最好就是一句pytho ...

  8. jQuery 工具类函数-字符串操作函数

    调用名为$.trim的工具函数,能删除字符串中左右两边的空格符,但该函数不能删除字符串中间的空格,调用格式为: $.trim (str); 参数str表示需要删除左右两边空格符的字符串. <bo ...

  9. 《手把手教你》系列技巧篇(五十)-java+ selenium自动化测试-字符串操作-上篇(详解教程)

    1.简介 自动化测试中进行断言的时候,我们可能经常遇到的场景.从一个字符串中找出一组数字或者其中的某些关键字,而不是将这一串字符串作为结果进行断言.这个时候就需要我们对字符串进行操作,宏哥这里介绍两种 ...

随机推荐

  1. Java用户自定义函数

    用户除了可以使用JavaScript的内置函数之外,还可以自己定义函数.自定义函数有3种方法. 使用关键字 function 构造 语法: function funcName([param1][,pa ...

  2. python 标准类库-数据类型之集合-容器数据类型

    标准类库-数据类型之集合-容器数据类型   by:授客 QQ:1033553122 Counter对象 例子 >>> from collections import Counter ...

  3. Android包管理机制(二)PackageInstaller安装APK

    前言 在本系列上一篇文章Android包管理机制(一)PackageInstaller的初始化中我们学习了PackageInstaller是如何初始化的,这一篇文章我们接着学习PackageInsta ...

  4. Django-404错误处理

    404错误是用户输入错误的URL,在 URLconf 中匹配不到相应的URL而抛出的异常 如下图: 为了给用户提供一个友好的访问,需要配置404错误页面 1.在 templates 目录下新建 404 ...

  5. sql server 的Maintenance Plans(维护计划)详解

    下面说下我遇到的场景,就是我通过数据库自身的维护计划建立了数据库收缩自动计划,却发现数据库并没有实际性收缩. 前奏自动化配置流程 数据库--管理---维护计划--双击(维护计划向导)--下一步--名称 ...

  6. MySQL 系列(四) 主从复制、读写分离、模拟宕机、备份恢复方案生产环境实战

    本章内容: 主从复制 简介原理 备份主库及恢复从库,配置从库生效 读写分离 如果主宕机了,怎么办? 双主的情况 MySQL 备份及恢复方案 备份单个及多个数据库 mysqldump 的常用参数 如何增 ...

  7. xshell的一些常用配置

    1  在xshell中鼠标滚轮和右键的快捷方式 利用鼠标滚轮和右键快速粘贴上面复制的内容 打开xshell的工具---选项-----键盘和鼠标 点击确定 回到xshell即可使用

  8. Ubuntu 12.04上安装Hadoop并运行

    Ubuntu 12.04上安装Hadoop并运行 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在官网上下载好四个文件 在Ubuntu的/home/w ...

  9. Python里面search()和match()的区别

    转自https://www.cnblogs.com/aaronthon/p/9435967.html match()函数只检测字符串开头位置是否匹配,匹配成功才会返回结果,否则返回None searc ...

  10. Loj 6068. 「2017 山东一轮集训 Day4」棋盘

    Loj 6068. 「2017 山东一轮集训 Day4」棋盘 题目描述 给定一个 $ n \times n $ 的棋盘,棋盘上每个位置要么为空要么为障碍.定义棋盘上两个位置 $ (x, y),(u, ...