我正在尝试使用正则表达式解析构建日志文件以获取一些信息。我正在尝试使用正则表达式("( {9}time)(.+)(c1xx\\.dll+)(.+)s")
来匹配一行time(D:\Program Files\Microsoft Visual Studio 11.0\VC\bin\c1xx.dll)=0.047s
在一个有 19,000 行的文件中,这大约需要 120 秒才能完成。其中一些相当大。基本问题是当我将行数减少到 19000 左右时,使用某些条件,它没有改变任何东西,实际上使情况变得更糟。我不明白,如果我完全删除正则表达式,只扫描文件大约需要6s。这意味着正则表达式是这里主要的耗时过程。那么为什么当我删除一半的行时,它至少不会降低一些。
另外,谁能告诉我哪种正则表达式更快、更通用或更具体。即,我也可以time(D:\Program Files\Microsoft Visual Studio 11.0\VC\bin\c1xx.dll)=0.047s
使用此正则表达式在文件中匹配此行 uniquley - ("(.+)(c1xx.dll)(.+)")
。但这会使整个事情运行得更慢,但是当我使用类似("( {9}time)(.+)(c1xx\\.dll+)(.+)")
It 的东西时,它会运行得稍微快一些。
我正在使用 c++ 11 正则表达式库,主要是 regex_match 函数。
regex c1xx("( {9}time)(.+)(c1xx\\.dll+)(.+)s");
auto start = system_clock::now();
int linecount = 0;
while (getline(inFile, currentLine))
{
if (regex_match(currentLine.c_str(), cppFile))
{
linecount++;
// Do something, just insert it into a vector
}
}
auto end = system_clock::now();
auto elapsed = duration_cast<milliseconds>(end - start);
cout << "Time taken for parsing first log = " << elapsed.count() << " ms" << " lines = " << linecount << endl;
输出:
解析第一个日志所需的时间 = 119416 毫秒行 = 19617
regex c1xx("( {9}time)(.+)(c1xx\\.dll+)(.+)s");
auto start = system_clock::now();
int linecount = 0;
while (getline(inFile, currentLine))
{
if (currentLine.size() > 200)
{
continue;
}
if (regex_match(currentLine.c_str(), cppFile))
{
linecount++;
// Do something, just insert it into a vector
}
}
auto end = system_clock::now();
auto elapsed = duration_cast<milliseconds>(end - start);
cout << "Time taken for parsing first log = " << elapsed.count() << " ms" << " lines = " << linecount << endl;
输出:
解析第一个日志所需的时间 = 131613 毫秒行 = 9216
为什么在第二种情况下需要更多时间?