我在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;
}
}
有效。但是在接近尾声时,表现并不好。
因为它从头到尾迭代。
有什么建议吗?
答案 0 :(得分:0)
通过创建一次正则表达式并重复使用它,可以使搜索速度更快,整体运行时速度提高一倍:
var rx = new Regex("\bword\b", RegexOptions.Compiled);
while ((l = r.ReadLine()) != null)
if (rx.IsMatch(l))
break;
否则,你不会获得太大的改进,因为大部分时间花在从磁盘加载文件上(至少对我而言 - 你会看到更快的驱动器有更大的改进)。我创建的一个大文件的结果,并将搜索到的单词放在最后:
您的代码1526 ms
我的密码:762毫秒
无代码(空时((l = r.ReadLine())!= null)循环):597 ms
如您所见,仅读取文件已花费近600毫秒。
现在,如果您可以加载文件一次,将其保存在内存中,并在需要时进行搜索 - 那么正则表达式应该相当快(在上述情况下约为100毫秒)。如果您多次搜索同一个文件,这将是一个好主意。