Created
May 9, 2019 10:19
-
-
Save jdh30/7fe500222d2f39519146d0da48f70493 to your computer and use it in GitHub Desktop.
Regular expression benchmark in C++
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "stdafx.h" | |
#include <windows.h> | |
#include <regex> | |
#include <vector> | |
#include <string> | |
#include <fstream> | |
#include <cstdio> | |
#include <codecvt> | |
using namespace std; | |
wstring load(wstring filename) { | |
const locale empty_locale = locale::empty(); | |
typedef codecvt_utf8<wchar_t> converter_type; | |
const converter_type* converter = new converter_type; | |
const locale utf8_locale = locale(empty_locale, converter); | |
wifstream in(filename); | |
wstring contents; | |
if (in) | |
{ | |
in.seekg(0, ios::end); | |
contents.resize(in.tellg()); | |
in.seekg(0, ios::beg); | |
in.read(&contents[0], contents.size()); | |
in.close(); | |
} | |
return(contents); | |
} | |
int count(const wstring &re, const wstring &s){ | |
static const wregex rsplit(re); | |
auto rit = wsregex_token_iterator(s.begin(), s.end(), rsplit, -1); | |
auto rend = wsregex_token_iterator(); | |
int count=0; | |
for (auto it=rit; it!=rend; ++it) | |
count += it->length(); | |
return count; | |
} | |
int _tmain(int argc, _TCHAR* argv[]) | |
{ | |
wstring str = load(L"pg10.txt"); | |
wstring re = load(L"re.txt"); | |
__int64 freq, tStart, tStop; | |
unsigned long TimeDiff; | |
QueryPerformanceFrequency((LARGE_INTEGER *)&freq); | |
QueryPerformanceCounter((LARGE_INTEGER *)&tStart); | |
vector<int> res(4); | |
#pragma omp parallel num_threads(4) | |
for(auto i=0; i<res.size(); ++i) | |
res[i] = count(re, str); | |
QueryPerformanceCounter((LARGE_INTEGER *)&tStop); | |
TimeDiff = (unsigned long)(((tStop - tStart) * 1000000) / freq); | |
printf("(%d, %d, %d, %d) %fs\n", res[0], res[1], res[2], res[3], TimeDiff/1e6); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment