0

我在 codercharts.com 上玩拼图。

我正在使用 StreamReader readline 和正则表达式来 grep 单词。

伪代码:

using (StreamReader r = new StreamReader(a[1]))
{
      bool found;
      while ((l = r.ReadLine()) != null){
          MatchCollection matches = Regex.Matches(l,String.Format(@"\b{0}\b",'YourWordHere'));
          found = matches.Count>0
          break;
      }
}

有用。但是在处理接近尾声的一个词时,表现并不好。

因为它从头到尾迭代。

有什么建议吗?

4

1 回答 1

0

通过创建一次正则表达式并重用它,您可以使搜索速度更快,整体运行时间大约提高一倍:

            var rx = new Regex("\bword\b", RegexOptions.Compiled);
            while ((l = r.ReadLine()) != null)
                if (rx.IsMatch(l))
                    break;

否则,您将不会获得太大的改进,因为大部分时间都花在从磁盘加载文件上(至少对我来说 - 您会看到更快的驱动器带来更大的改进)。我创建的一个大文件上的结果并将搜索到的单词放在最后:

您的代码 1526 毫秒

我的代码:762 毫秒

无代码(空 while ((l = r.ReadLine()) != null) 循环):597 毫秒

如您所见,仅读取文件已经花费了将近 600 毫秒。

现在,如果您可以加载文件一次,将其保存在内存中,并在需要时进行搜索 - 那么正则表达式应该相当快(在上述情况下约为 100 毫秒)。如果您多次搜索同一个文件,这将是一个好主意。

于 2013-09-21T13:56:02.603 回答