.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. ArrayMap 和HashMap的区别

    在以往android开发中,我们常常用key-value存储数据时,随手就会打出HashMap的代码,当数据量较小时,这种方法还不错还可以,当数据量比较多的时候,如果是PC机上,也还阔以.但是如果使用 ...

  2. (网页)sweetalert api 中文开发文档和手册,项目放弃alert

    弹框json的特别好使. sweetalert 示例 基本信息弹窗swal("这是一条信息!") 标题与文本的信息弹窗swal("这是一条信息!", " ...

  3. Could not update the distribution database subscription table. The subscription status could not be changed.

    在一个测试服务器删除发布(Publication)时遇到下面错误,具体如下所示 标题: Microsoft SQL Server Management Studio   --------------- ...

  4. JQuery实现全选、全不选和反选功能

    看重点就行了,最后面给一个网页完整的代码 代码实例: function selectStu() { $.ajax("StuList",{ type:"post" ...

  5. C# DBHelper类 参考

    using System;using System.Collections.Generic;using System.Text;using System.Configuration;using Sys ...

  6. mysql 数据库 命令行的操作——对表和字段的操作

    一.对表的操作 1.查看所有表 show tables: 2.创建表 create table 表名(字段1 类型1 约束1 ,字段2 类型2 约束2): 3.修改表的名字 rename table ...

  7. python列表与元组的用法

    python列表与元组的用法 目录: 列表的用法: 1.增   append   +    extend 2.删  del    remove 3.改   insert 4.查  index 5.反向 ...

  8. IPerf——网络测试工具介绍与源码解析(3)

    [线程的生成]   生成线程时需要传入一个thread_Settings类型的变量,thread_Settings包含所有线程运行时需要的信息,命令行选项参数解析后所有得到的属性都存储到该类型的变量中 ...

  9. LeetCode算法题-Binary Watch(Java实现)

    这是悦乐书的第216次更新,第229篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第84题(顺位题号是401).二进制手表顶部有4个LED,代表小时(0-11),底部的6 ...

  10. puppet 横向扩展(二)

    Table of Contents 1. 概述 2. 实验环境 3. 实验步骤 3.1. 机器B 的环境 3.1.1. 安装puppetmaster 以及 apache passenger 3.1.2 ...