【发布时间】:2018-11-09 15:31:59
【问题描述】:
我正在学习 c++ 和 java 中的正则表达式。所以我用相同的表达式和相同的输入数对 c++11 正则表达式和 java 正则表达式进行了性能测试。奇怪的是,java regex 比 c++11 regex 快。我的代码有什么问题吗?请纠正我
Java 代码:
import java.util.regex.*;
public class Main {
private final static int MAX = 1_000_000;
public static void main(String[] args) {
long start = System.currentTimeMillis();
Pattern p = Pattern.compile("^[\\w._]+@\\w+\\.[a-zA-Z]+$");
for (int i = 0; i < MAX; i++) {
p.matcher("abcd_ed123.t12y@haha.com").matches();
}
long end = System.currentTimeMillis();
System.out.print(end-start);
}
}
C++ 代码:
#include <iostream>
#include <Windows.h>
#include <regex>
using namespace std;
int main()
{
long long start = GetTickCount64();
regex pat("^[\\w._]+@\\w+\\.[a-zA-Z]+$");
for (long i = 0; i < 1000000; i++) {
regex_match("abcd_ed123.t12y@haha.com", pat);
}
long long end = GetTickCount64();
cout << end - start;
return 0;
}
性能:
Java -> 1003ms
C++ -> 124360ms
【问题讨论】:
-
显而易见的问题:你是如何编译 c++ 代码的?你有优化吗?
-
所以你的结论是你的代码有问题,因为 Java 的性能比 C++ 好?
-
请确认您已编译您的 C++ 代码并启用了优化。此外,您不仅在测量正则表达式,还在测量打印语句。我不会认为这是一个有效的测试。
-
您是否为 Debug 或 Release 构建计时?它们之间可能存在显着的性能差异(Release 启用优化)。
-
对!在发布版本中,我得到 VS2017 的 1672 毫秒。
标签: java c++ regex performance c++11