バナーをクリックすれば目次に戻ります
Copyright 1999 Rogue Wave Software
Copyright 1999 Sun Microsystems, Inc.
RWBench
#include <rw/bench.h> (抽象基底クラス)
このクラスを実行するには、派生クラスのインスタンスを作成して go() を呼び出します。その後、report() を呼び出して標準的な要約を入手します。多くのコンパイラでは、この要約にはコンパイラのタイプとメモリーモデルが自動的に含まれます。より詳細な結果を知りたいときには、ops() や outerLoops() などを呼び出すことができます。
オーバーヘッドを補正したいときは、ベンチマークに関連しない部分の計算を行う idleLoop() 関数を使用します。
#include <rw/bench.h> /* ベンチマークソフトウェア */ #include <rw/cstring.h> /* Rogue Wave 文字列クラス */ #include <stdlib.h> #include <iostream.h> #include <rw/ctoken.h> #include <rw/regexp.h> // ハッシュ対象の文字列 const char* cs = "A multi-character string with lots of words in it to be parsed out and searched for."; class TestBrute : public RWBench { public: TestBrute() { } virtual void doLoop(unsigned long n); virtual void idleLoop(unsigned long n); virtual void what(ostream& s) const { s << "Brute force string search: \n"; } }; class TestRW : public RWBench { public: TestRW() { } virtual void doLoop(unsigned long n); virtual void idleLoop(unsigned long n); virtual void what(ostream& s) const { s << "Rogue Wave search: \n"; } }; main(int argc, char* argv[]){ cout << "Testing string \n\"" << cs << "\"\n"; // 文字列検索アルゴリズムをテストする TestBrute other; other.parse(argc, argv); other.go(); other.report(cout); // 正規表現を使った RW 検索をテストする TestRW rw; rw.parse(argc, argv); rw.go(); rw.report(cout); return 0; } void TestBrute::doLoop(unsigned long n){ RWCString string(cs); RWCTokenizer *tokener; RWCString token; tokener = new RWCTokenizer(string); while(n--){ if((token = (*tokener)()).isNull()) { delete tokener; tokener = new RWCTokenizer(string); token = (*tokener)(); } size_t j = 0; for(size_t i = 0; i < string.length() && j != token.length(); i++) { j = 0; while((j < token.length()) && (string[i+j]==token[j])) j++; } } delete tokener; } void TestRW::doLoop(unsigned long n){ RWCString string(cs); RWCTokenizer *tokener; RWCString token, result; RWCRegexp re(""); tokener = new RWCTokenizer(string); while(n--){ if((token = (*tokener)()).isNull()) { delete tokener; tokener = new RWCTokenizer(string); token = (*tokener)(); } re = RWCRegexp(token); result = string(re); //Do the search! } delete tokener; } void TestBrute::idleLoop(unsigned long n){ RWCString string(cs); // オーバーヘッドを除く RWCTokenizer *tokener; RWCString token; tokener = new RWCTokenizer(string); while(n--){ if((token = (*tokener)()).isNull()) { delete tokener; tokener = new RWCTokenizer(string); token = (*tokener)(); } } delete tokener; } void TestRW::idleLoop(unsigned long n){ RWCString string(cs); // オーバーヘッドを除く RWCTokenizer *tokener; RWCString token, result; RWCRegexp re(""); tokener = new RWCTokenizer(string); while(n--){ if((token = (*tokener)()).isNull()) { delete tokener; tokener = new RWCTokenizer(string); token = (*tokener)(); } re = RWCRegexp(token); } delete tokener; } |
Testing string "A multi-character string with lots of words in it to be parsed out and searched for." Borland C++ V4.0 Brute force string search: Iterations: 35 Inner loop operations: 1000 Total operations: 35000 Elapsed (user) time: 4.596 Kilo-operations per second: 7.61532 Borland C++ V4.0 Rogue Wave search: Iterations: 53 Inner loop operations: 1000 Total operations: 53000 Elapsed (user) time: 2.824 Kilo-operations per second: 18.7677 |
RWBench(double duration = 5, unsigned long ILO=1000, const char* machine = 0);
virtual void doLoop(unsigned long N)=0;
double duration() const;
virtual void go();
virtual void idleLoop(unsigned long N);
const char * machine();
virtual void parse(int argc, char* argv[]);
引数 | 型 | 説明 |
---|---|---|
argv[1] | double | 時間 (秒) |
argv[2] | unsigned long | 内部ループ回数 |
argv[3] | const char* | マシン |
void parse(const char *);
virtual void report(ostream&) const;
double setDuration(double t);
unsigned long setInnerLoops(unsigned long N);
virtual void what(ostream&) const;
void where(ostream&) const;
unsigned long innerLoops() const;
double time() const;
unsigned long outerLoops() const;
double ops() const;
double opsRate() const;