From dcf868f0f2ab4072bf3523e8f2c9a89ed8c80b7d Mon Sep 17 00:00:00 2001 From: Tu Dinh <1257909+dinhngtu@users.noreply.github.com> Date: Sun, 14 Jan 2024 20:31:04 +0100 Subject: [PATCH] wordlister: add benchmarks --- WordLister/Bench.cpp | 76 +++++++++++++++++++++++++++ WordLister/WordLister.cpp | 6 ++- WordLister/WordLister.vcxproj | 1 + WordLister/WordLister.vcxproj.filters | 3 ++ 4 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 WordLister/Bench.cpp diff --git a/WordLister/Bench.cpp b/WordLister/Bench.cpp new file mode 100644 index 0000000..d71e4ff --- /dev/null +++ b/WordLister/Bench.cpp @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: GPL-3.0-only + +#include "stdafx.h" +#include +#include "Telex.h" +#include "WordListIterator.hpp" +#include "FileUtil.hpp" + +using namespace VietType::Telex; +using namespace VietType::TestLib; + +#ifdef _DEBUG +#define EITERATIONS 10 +#define VITERATIONS 200 +#else +#define EITERATIONS 100 +#define VITERATIONS 2000 +#endif + +bool bench() { + { + LONGLONG efsize; + auto ewords = static_cast(ReadWholeFile(L"..\\..\\data\\ewdsw.txt", &efsize)); + auto ewend = ewords + efsize / sizeof(wchar_t); + TelexConfig config; + TelexEngine engine(config); + unsigned long long count = 0; + auto t1 = std::chrono::high_resolution_clock::now(); + for (auto i = 0; i < EITERATIONS; i++) { + for (WordListIterator ew(ewords, ewend); ew != ewend; ew++) { + std::wstring eword(*ew, ew.wlen()); + engine.Reset(); + for (auto c : eword) { + engine.PushChar(c); + engine.Peek(); + } + engine.Commit(); + engine.Retrieve(); + count++; + } + } + auto t2 = std::chrono::high_resolution_clock::now(); + wprintf( + L"ewords total iters: %d, count = %llu, time = %llu us\n", + EITERATIONS, + count, + std::chrono::duration_cast(t2 - t1).count()); + FreeFile(ewords); + } + + { + LONGLONG vfsize; + auto vwords = static_cast(ReadWholeFile(L"..\\..\\data\\vw39kw.txt", &vfsize)); + auto vwend = vwords + vfsize / sizeof(wchar_t); + TelexConfig config; + TelexEngine engine(config); + unsigned long long count = 0; + auto t1 = std::chrono::high_resolution_clock::now(); + for (auto i = 0; i < VITERATIONS; i++) { + for (WordListIterator vw(vwords, vwend); vw != vwend; vw++) { + std::wstring vword(*vw, vw.wlen()); + engine.Reset(); + engine.Backconvert(vword); + count++; + } + } + auto t2 = std::chrono::high_resolution_clock::now(); + wprintf( + L"vwords total iters: %d, count = %llu, time = %llu us\n", + VITERATIONS, + count, + std::chrono::duration_cast(t2 - t1).count()); + FreeFile(vwords); + } + return true; +} diff --git a/WordLister/WordLister.cpp b/WordLister/WordLister.cpp index 386c871..24c8294 100644 --- a/WordLister/WordLister.cpp +++ b/WordLister/WordLister.cpp @@ -5,6 +5,7 @@ bool vietscan(const wchar_t* filename); bool engscan(const wchar_t* filename); bool dualscan(); +bool bench(); int wmain(int argc, wchar_t** argv) { if (argc == 3 && !wcscmp(argv[1], L"vietscan")) { @@ -13,10 +14,13 @@ int wmain(int argc, wchar_t** argv) { return !engscan(argv[2]); } else if (argc == 2 && !wcscmp(argv[1], L"dualscan")) { return !dualscan(); + } else if (argc == 2 && !wcscmp(argv[1], L"bench")) { + return !bench(); } else { wprintf(L"usage: \n" L" wordlister \n" - L" wordlister dualscan\n"); + L" wordlister dualscan\n" + L" wordlister bench\n"); return 1; } } diff --git a/WordLister/WordLister.vcxproj b/WordLister/WordLister.vcxproj index 5979cfb..3edc225 100644 --- a/WordLister/WordLister.vcxproj +++ b/WordLister/WordLister.vcxproj @@ -140,6 +140,7 @@ + diff --git a/WordLister/WordLister.vcxproj.filters b/WordLister/WordLister.vcxproj.filters index bab0629..6674295 100644 --- a/WordLister/WordLister.vcxproj.filters +++ b/WordLister/WordLister.vcxproj.filters @@ -27,6 +27,9 @@ Source Files + + Source Files +