diff -r 000000000000 -r 671dee74050a searchengine/cpix/tsrc/perfmetrics/src/perfmetrics.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/searchengine/cpix/tsrc/perfmetrics/src/perfmetrics.cpp Mon Apr 19 14:40:16 2010 +0300 @@ -0,0 +1,369 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Main application class +* +*/ + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include + +#include "idxutil.h" +#include "itk.h" +#include "corpustester.h" + +#include "testvector.h" + +// This is a GCCE toolchain workaround needed when compiling with GCCE +// and using main() entry point +#ifdef __GCCE__ +#include +#endif + +/* OBS +TestVector testVectors[] = { + { "plain", 0, 60000, 5000, 100, 100, SOME_QUERY_TERMS, 5, 5}, + // { "plain", 0, 120000, 15000, 100, 100, SOME_QUERY_TERMS, 1, 0}, + // { "plain", 0, 30000, 5000, 100, 100, SOME_QUERY_TERMS, 5, 5}, + // ORIGINAL { "plain", 0, 30, 5, 2, 2, SOME_QUERY_TERMS, 5, 5}, + + // penalty due to search - write state switch + { "swA", 30000, 20, 20, 0, 0, SOME_QUERY_TERMS, 20, 0}, + { "swB", 30000, 20, 1, 0, 0, SOME_QUERY_TERMS, 1, 0}, + + // penalty due to write - delete state switch + { "wdA", 30000, 20, 20, 0, 20, EMPTY_QUERY_TERMS, 0, 0}, + { "wdB", 30000, 20, 1, 0, 1, EMPTY_QUERY_TERMS, 0, 0}, + + // sys performance + { "sys", 0, 2001, 100, 10, 10, SOME_QUERY_TERMS, 5, 5} +}; +*/ + + +#define BASEDIR "c:\\data\\perfmetrics\\" + +#define TESTVECTOR "c:\\data\\perfmetrics\\testvector.txt" + + +extern const char BaseDir[] = BASEDIR; + + +// +// Install util/hugetestcorpus/....sis ! +// +// There is no install package for pois.txt: you have to use one POI +// dump file and copy it manually to the right directory +// + +#ifdef __WINS__ +const char TEST_CORPUS_FILE[] = "c:\\data\\perfmetricscorpus\\hugetestcorpus.txt"; +const char POI_CORPUS_FILE[] = "c:\\data\\perfmetricscorpus\\pois.txt"; +const char STREET_CORPUS_FILE[] = "c:\\data\\perfmetricscorpus\\streets.csv"; +#else +const char TEST_CORPUS_FILE[] = "e:\\data\\perfmetricscorpus\\hugetestcorpus.txt"; +const char POI_CORPUS_FILE[] = "e:\\data\\perfmetricscorpus\\pois.txt"; +const char STREET_CORPUS_FILE[] = "e:\\data\\perfmetricscorpus\\streets.csv"; +#endif + +class TestVectorContext : public Itk::ITestContext +{ + TestVector tv_; + CorpusTester * corpusTester_; + IdxUtil * idxUtil_; + +public: + + TestVectorContext(const TestVector & testVector) + : tv_(testVector), + corpusTester_(NULL), + idxUtil_(NULL) + { + ; + } + + + virtual void setup() throw (Itk::PanicExc) + { + using namespace std; + + /* OBS + bool + poi = (tv_.testName == "poi"); + const char + * corpusPath = poi ? POI_CORPUS_FILE : TEST_CORPUS_FILE; + */ + try + { + const char + * corpusPath = NULL; + auto_ptr + iu; + + if (tv_.testName == "plain") + { + corpusPath = TEST_CORPUS_FILE; + iu.reset(new IdxUtil()); + } + else if (tv_.testName == "poi") + { + corpusPath = POI_CORPUS_FILE; + iu.reset(new PoiIdxUtil()); + } + else if (tv_.testName == "street") + { + corpusPath = STREET_CORPUS_FILE; + iu.reset(new StreetIdxUtil()); + } + + iu->init(static_cast(tv_.create)); + cpix_IdxDb_setMaxInsertBufSize( iu->idxDb(), + tv_.bufferSize ); + + auto_ptr + ct(new CorpusTester(corpusPath, + tv_.numPreindexedItems, + tv_.testName, + tv_.bufferSize, + tv_.maxInputSize, + tv_.lumpSize, + tv_.first, + tv_.last, + tv_.queryTerms, + tv_.search, + tv_.incrementalSearch, + tv_.minIncrementalLength, + tv_.suggestionSearch, + tv_.minSuggestionLength, + tv_.takeIdxSnapshot, + tv_.addLasts, + tv_.delReAddLasts, + tv_.updateLasts)); + /* OBS + auto_ptr + iu(poi ? new PoiIdxUtil() : new IdxUtil()); + iu->init(static_cast(tv_.create)); + */ + + corpusTester_ = ct.get(); + ct.release(); + + idxUtil_ = iu.get(); + iu.release(); + } + catch (std::exception & exc) + { + ITK_PANIC("Cant' initialize corpus tester for %s: %s", + tv_.testName.c_str(), + exc.what()); + } + catch (...) + { + ITK_PANIC("Can't initialize corpus tester for %s: unknown reason.", + tv_.testName.c_str()); + } + } + + + virtual void tearDown() throw() + { + cleanup(); + } + + + virtual ~TestVectorContext() + { + cleanup(); + } + + + void measure(Itk::TestMgr * testMgr) + { + corpusTester_->run(testMgr, + idxUtil_); + } + + +private: + void cleanup() throw() + { + delete corpusTester_; + corpusTester_ = NULL; + + delete idxUtil_; + idxUtil_ = NULL; + } +}; + + +Itk::TesterBase * CreateTestHierarchy() +{ + using namespace Itk; + + // "all" + SuiteTester + * all = new SuiteTester("all"); + + std::ifstream + ifs(TESTVECTOR); + TestVector + tv; + ifs >> tv; + + TestVectorContext + * tvc = new TestVectorContext(tv); + ContextTester + * contextTester = new ContextTester(tv.testName.c_str(), + tvc); + contextTester->add("measure", + tvc, + &TestVectorContext::measure); + + all->add(contextTester); + + return all; +} + + + +void initBaseDir(const char * path) +{ + if (!Cpt::directoryexists(path)) + { + if (Cpt::mkdirs(path, 0777) != 0) + { + printf("Could not create base directory: %s\n", + path); + exit(2); + } + } +} + + + +void checkCorpus(const char * path) +{ + if (!Cpt::isreadable(path)) + { + printf("Could not open test corpus for reading: %s\n", + path); + exit(2); + } +} + + + +int main(int , + const char * ) +{ + using namespace std; + + int + rv = 0; + + cpix_Result + result; + cpix_init(&result, + NULL); + if (cpix_Failed(&result)) + { + wchar_t + buffer[128]; + cpix_Error_report(result.err_, + buffer, + sizeof(buffer)/sizeof(wchar_t)); + printf("Failed to initialize CPix: %S\n", buffer); + return -1; + } + + std::auto_ptr + testCase(CreateTestHierarchy()); + + string + cmd("all"); + + initBaseDir(BASEDIR); + checkCorpus(TEST_CORPUS_FILE); + + bool + help = false; + const char + * focus = NULL; + string + outPath(BASEDIR); + + if (cmd == "h") + { + help = true; + outPath += "help.txt"; + } + else + { + focus = cmd.c_str(); + outPath += focus; + outPath += ".txt"; + } + + ofstream + ofs(outPath.c_str()); + + if (help) + { + std::cout << "Test hierarchy:" << endl; + testCase->printHierarchy(std::cout); + + if (ofs) + { + ofs << "Test hierarchy:" << endl; + testCase->printHierarchy(ofs); + } + } + else + { + auto_ptr + observer(new Itk::CompositeTestRunObserver()); + observer->add(new Itk::TestRunConsole(std::cout)); + + // do this only if you need a way to confirm that the + // process is running on the phone without proper std IO + // console + // observer->add(new Itk::ProgressFsDisplayer()); + + // this observer will dump every event to a file, so it + // slows down everything, but when things crash, at least + // you get partial results on the file system + observer->add(new Itk::ProgressDumper(BASEDIR "dump.txt")); + + Itk::TestMgr + testMgr(observer.get(), + BASEDIR); + + rv = testMgr.run(testCase.get(), focus); + + // TMP DISABLED testMgr.generateSummary(std::cout); + + if (ofs) + { + testMgr.generateSummary(ofs); + } + } + + // OBS int c = getchar(); + return rv; +} +