C#(.NET 4.0)中的快速字符串后缀检查?

C#(.NET 4.0)中的快速字符串后缀检查?,第1张

概述在C#中检查字符串后缀的最快方法是什么? 我需要检查一个特定术语的大型列表中的每个字符串(从5000到100000个项目).保证该术语永远不会嵌入字符串中.换句话说,如果字符串包含该术语,则它将位于字符串的末尾.该字符串也保证长于后缀.文化信息并不重要. 这些是针对100000个字符串执行的不同方法(其中一半具有后缀): 1. Substring Comparison - 13.60ms 2. 在C#中检查字符串后缀的最快方法是什么?

我需要检查一个特定术语的大型列表中的每个字符串(从5000到100000个项目).保证该术语永远不会嵌入字符串中.换句话说,如果字符串包含该术语,则它将位于字符串的末尾.该字符串也保证长于后缀.文化信息并不重要.

这些是针对100000个字符串执行的不同方法(其中一半具有后缀):

1.  Substring Comparison - 13.60ms 2.  String.Contains - 22.33ms 3.  CompareInfo.IsSuffix - 24.60ms 4.  String.EndsWith - 29.08ms 5.  String.LastIndexOf - 30.68ms

这些是平均时间. [编辑]忘了提到字符串也被放入单独的列表中,但这并不重要.它确实增加了运行时间.

在我的系统子字符串比较中(使用String.Substring方法提取字符串的结尾并将其与后缀术语进行比较)在针对100000字符串进行测试时始终是最快的.使用子字符串比较的问题是垃圾收集可以大大减慢它(比其他方法更多)因为String.Substring创建新的字符串. .NET 4.0中的效果并不像3.5及更低版本那么糟糕,但它仍然很明显.在我的测试中,String.Substring在12000-13000个字符串集上执行得更慢.这在系统和实现之间显然会有所不同.

[编辑]
基准代码:
http://pastebin.com/smEtYNYN

[编辑]
FlyingStreudel的代码运行速度很快,但Jon Skeet建议将EndsWith与StringComparison.Ordinal结合使用似乎是最好的选择.

解决方法 如果这是检查100,000个字符串所需的时间,那真的重要吗?

就个人而言,我会使用string.EndsWith,因为它是最具描述性的:它确切地说明了你要测试的内容.

我有点怀疑它似乎表现最差但是……如果你可以发布你的基准代码,那将是非常有用的. (特别是,它实际上不应该像string.Contains那样做.)

您是否尝试过指定序数匹配?这可能会使它明显加快:

if (x.EndsWith(y,StringComparison.Ordinal))

当然,除非你想要进行序数比较,否则你不应该这样做 – 你期待文化敏感的比赛吗? (开发人员倾向于不考虑这类事情,我非常坚定地将自己纳入该类别.)

总结

以上是内存溢出为你收集整理的C#(.NET 4.0)中的快速字符串后缀检查?全部内容,希望文章能够帮你解决C#(.NET 4.0)中的快速字符串后缀检查?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1241695.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存