void StressTest::Start(const WCHAR* path, const WCHAR* filter, const WCHAR* ranges, int cycles) { if (file::Exists(path)) { FilesProvider* filesProvider = new FilesProvider(path); ParsePageRanges(ranges, pageRanges); Start(filesProvider, cycles); } else if (dir::Exists(path)) { DirFileProvider* dirFileProvider = new DirFileProvider(path, filter); ParsePageRanges(ranges, fileRanges); Start(dirFileProvider, cycles); } else { // Note: string dev only, don't translate AutoFreeW s(str::Format(L"Path '%s' doesn't exist", path)); win->ShowNotification(s, NOS_WARNING, NG_STRESS_TEST_SUMMARY); Finished(false); } }
static void BenchFile(const WCHAR *filePath, const WCHAR *pagesSpec) { if (!file::Exists(filePath)) { return; } // ad-hoc: if enabled times layout instead of rendering and does layout // using all text rendering methods, so that we can compare and find // docs that take a long time to load if (Doc::IsSupportedFile(filePath) && !gGlobalPrefs->ebookUI.useFixedPageUI) { BenchEbookLayout(filePath); return; } if (ChmModel::IsSupportedFile(filePath) && !gGlobalPrefs->chmUI.useFixedPageUI) { BenchChmLoadOnly(filePath); return; } Timer total; logbench(L"Starting: %s", filePath); Timer t; BaseEngine *engine = EngineManager::CreateEngine(filePath); if (!engine) { logbench(L"Error: failed to load %s", filePath); return; } double timeMs = t.Stop(); logbench(L"load: %.2f ms", timeMs); int pages = engine->PageCount(); logbench(L"page count: %d", pages); if (nullptr == pagesSpec) { for (int i = 1; i <= pages; i++) { BenchLoadRender(engine, i); } } assert(!pagesSpec || IsBenchPagesInfo(pagesSpec)); Vec<PageRange> ranges; if (ParsePageRanges(pagesSpec, ranges)) { for (size_t i = 0; i < ranges.Count(); i++) { for (int j = ranges.At(i).start; j <= ranges.At(i).end; j++) { if (1 <= j && j <= pages) BenchLoadRender(engine, j); } } } delete engine; total.Stop(); logbench(L"Finished (in %.2f ms): %s", total.GetTimeInMs(), filePath); }
void StressTest::Start(const TCHAR *path, const TCHAR *filter, const TCHAR *ranges, int cycles) { srand((unsigned int)time(NULL)); GetSystemTime(&stressStartTime); // forbid entering sleep mode during tests SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED); basePath.Set(str::Dup(path)); fileFilter.Set(filter && !str::Eq(filter, _T("*")) ? str::Dup(filter) : NULL); if (file::Exists(basePath)) { filesToOpen.Append(str::Dup(basePath)); ParsePageRanges(ranges, pageRanges); } else if (dir::Exists(basePath)) { OpenDir(basePath); ParsePageRanges(ranges, fileRanges); } else { // Note: dev only, don't translate ScopedMem<TCHAR> s(str::Format(_T("Path '%s' doesn't exist"), path)); ShowNotification(win, s, false /* autoDismiss */, true, NG_STRESS_TEST_SUMMARY); Finished(false); return; } this->cycles = cycles; if (pageRanges.Count() == 0) pageRanges.Append(PageRange()); if (fileRanges.Count() == 0) fileRanges.Append(PageRange()); if (GoToNextFile()) TickTimer(); else Finished(true); }
static void BenchFile(TCHAR *filePath, const TCHAR *pagesSpec) { if (!file::Exists(filePath)) { return; } Timer total(true); logbench("Starting: %s", filePath); Timer t(true); BaseEngine *engine = EngineManager(!gUseEbookUI).CreateEngine(filePath); t.Stop(); if (!engine) { logbench("Error: failed to load %s", filePath); return; } double timems = t.GetTimeInMs(); logbench("load: %.2f ms", timems); int pages = engine->PageCount(); logbench("page count: %d", pages); if (NULL == pagesSpec) { for (int i = 1; i <= pages; i++) { BenchLoadRender(engine, i); } } assert(!pagesSpec || IsBenchPagesInfo(pagesSpec)); Vec<PageRange> ranges; if (ParsePageRanges(pagesSpec, ranges)) { for (size_t i = 0; i < ranges.Count(); i++) { for (int j = ranges.At(i).start; j <= ranges.At(i).end; j++) { if (1 <= j && j <= pages) BenchLoadRender(engine, j); } } } delete engine; total.Stop(); logbench("Finished (in %.2f ms): %s", total.GetTimeInMs(), filePath); }
// a valid page range is a non-empty, comma separated list of either // single page ("3") numbers, closed intervals "2-4" or intervals // unlimited to the right ("5-") bool IsValidPageRange(const TCHAR *ranges) { Vec<PageRange> rangeList; return ParsePageRanges(ranges, rangeList); }