バナーをクリックすれば目次に戻ります
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;
