.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. Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AOP编程比较

    本篇博文用一个稍复杂点的案例来对比一下基于XML配置与基于AspectJ注解配置的AOP编程的不同. 相关引入包等Spring  AOP编程准备,请参考小编的其他博文,这里不再赘述. 案例要求: 写一 ...

  2. 自动化测试 接口自动化及UI自动化测试平台设计演示

    接口自动化及UI自动化测试平台设计演示   by:授客  QQ:1033553122 欢迎加入全国软件测试交流qq群:7156436 大家好,我是授客. 本视频意在分享个人,基于Python,Djan ...

  3. View体系第一篇:基础

    View体系的学习内容为学习刘望舒先生博客总结的内容,大家可到他的博客看到更详细的内容. 一.view之间的继承关系 Viewground用来包裹其他view.在平常的使用中,我们不会直接用到View ...

  4. 2017.9.16~17,热烈庆祝共创力罗老师《敏捷MINI体验式实战培训》在某大型企业成功举办!

    2017.9.16~17日,深圳市共创力企业管理咨询有限公司为某上市企业提供了为期两天的内训服务.该次内训的主题为<敏捷MINI体验式实践培训>,为期两天.此次培训由共创力资深讲师Geor ...

  5. Jupyter Notebook默认工作路径的修改

    相信每一个学习Python的童鞋,都尝试过Jupyter Notebook,所以我也就不多介绍,真的还不错哎这软件. 不过美中不足的,就是它的默认工作路径,每次打开都是系统盘的Administrato ...

  6. 2019年Web前端最新导航(常见前端框架、前端大牛)

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 前言 本文列出了很多与前端有关的常见网站.博客.工具等,整体来看比较权威.有些东西已经 ...

  7. 如何设置访问内网web项目

    1.若我的项目搭建在一个linux虚拟机上 2.在内网的一台电脑做以下配置 3.测试访问 ******************************************************* ...

  8. mysql初始化提示安装perl

    all_db --user=mysql --datadir=/data/mysql", "delta": "0:00:00.222500", &quo ...

  9. mssql sqlserver update delete表别名用法简介

    转自:http://www.maomao365.com/?p=6973  摘要: 在sql脚本编写中,如果需要在update delete 中使用表别名的方法,必须按照一定的规则编写,否则将会出现相应 ...

  10. Foreach用法

    循环语句是编程的基本语句,在C#中除了沿用C语言的循环语句外,还提供了foreach语句来实现循环.那么我要说的就是,在循环操作中尽量使用foreach语句来实现.   为了来更好地说明为什么要提倡使 ...