2010-07-01 154 views
2

我是,目前在.NET 4.0中工作我的第一个项目,它需要几千个字符串比较(我正在搜索目录,有时甚至是某些文件的整个驱动器)。大多数情况下,字符串非常短,因为我只查看文件路径,所以我只是使用String.Contains()来查看文件路径字符串是否包含我的针串。什么时候应该使用Regex而不是String.IndexOf()?或String.Contains()?

我想知道虽然,正则表达式会是一个更好的主意吗?正则表达式比标准字符串比较更快?它是基于比较的字符串的长度还是比较的字符串的数量?

+3

无论字符串的长度是多少,常规字符串查找操作的性能都优于正则表达式。如果您可以通过常规查找来完成,请使用常规查找。 – Amber 2010-07-01 17:31:48

+4

当IndexOf和Contains不能用于您要查找的内容时。 – Will 2010-07-01 17:36:28

回答

2

它是可变的。比较性能是输入数据的复杂功能,文化用于比较,区分大小写和CompareOptions。实例化Regex对象会更昂贵(除非它在Regex缓存中),所以如果您进行了大量的比较,那么使用起来并不好,我发现它通常比IndexOf()慢,但是YMMV。

请记住,使用Contains/IndexOf时,用户/线程正在运行的区域将决定如何完成比较。这可能会对性能产生重大影响。并非所有的文化都如此快速。

不变文化是一个非常快速的文化。如果你直接使用CompareInfo,而不是做String.IndexOf(),它仍然会更快。

CultureInfo.InvariantCulture.CompareInfo.IndexOf(..) 

做出正确选择的唯一方法就是基准测试。这就是说,除非你要通过很多兆字节的字符串,否则对任何人都不会有什么影响。正如ChrisF早些时候所说的那样,在这种情况下关注可读/可维护的代码。

下面是关于如何充分利用正则表达式的好文章: Optimizing Regular Expression Performance

2

如果你的搜索表达式很简单,那么我认为它不值得移植到正则表达式中 - 无论你在编码和阅读方面有多好,当你(或者更重要的是)需要更多的时间来理解代码时,另外一些人)在6个月的时间内再看一遍。

如果速度的提高只能保持较小的可读性和可维护性代码。

1

我只是猜测,但我怀疑,对于简单的字符串搜索会出现在String.Contains()String.IndexOf()和正则表达式之间的性能差别不大(如果有的话,我猜想,正则表达式绝不会更快,但可能会比较慢以微乎其微的量)。

除非您的要求(或成为)使您需要匹配比子串更复杂的东西,否则不应该考虑移动到正则表达式。

0

在.NET 4.0中没有与问题String.IndexOf致电看到修补程序2467309,它可以帮助你决定你的答案。

相关问题