我现在正在使用.NET 4.0开发我的第一个项目,它需要几千个字符串比较(我正在搜索目录,有时甚至是某些文件的整个驱动器)。在大多数情况下,字符串很短,因为我只查看文件路径,所以我刚刚使用String.Contains()来查看文件路径字符串是否包含我的针字符串。
我想知道,Regex会是一个更好的主意吗? Regex在什么时候比标准字符串比较更快?它是基于被比较的字符串的长度还是被比较的字符串数量?
答案 0 :(得分:2)
如果您的搜索表达式很简单,那么我认为值得转移到正则表达式 - 无论您在编码和阅读它们方面有多好,它都会花费您更多时间来理解代码(或者更重要的是,其他人)在6个月的时间内再次看一遍。
如果速度的改进只是边缘保持不变,那么可读性和可维护性更强。
答案 1 :(得分:2)
这是变数。比较性能是输入数据的复杂函数,用于比较的文化,区分大小写和CompareOptions
。 Regex对象实例化的成本更高(除非它在Regex
缓存中),所以如果你进行了大量的一次性比较,那么使用它并不是很好,而且我发现它通常比{更慢} {1}},但是YMMV。
请记住,使用Contains / IndexOf时,运行用户/线程的文化将决定比较的完成方式。这可能会对性能产生重大影响。并非所有文化都如此快。
不变文化是一种非常快速的文化。如果您直接使用IndexOf()
,而不是CompareInfo
,那么它会更快一些。
String.IndexOf()
对做出正确选择有信心的唯一方法是进行基准测试。也就是说,除非你转移到数兆字节的字符串,否则对任何人都没有影响。正如ChrisF先前所说,在这种情况下,请关注可读/可维护代码。
这是一篇关于充分利用正则表达式的好文章: Optimizing Regular Expression Performance
答案 2 :(得分:1)
我只是猜测,但我怀疑对于简单的子字符串搜索,String.Contains()
,String.IndexOf()
和正则表达式之间的性能差别不大(如果有的话,我猜这个正则表达式永远不会更快,但可能会以微不足道的速度变慢。)
你不应该考虑转移到正则表达式,除非你的要求是(或变成)你需要匹配比子串更复杂的东西。
答案 3 :(得分:0)
在.Net 4.0中,String.IndexOf调用存在问题,请参阅修补程序2467309,它可以帮助您确定答案。