C++相談室 part14

このエントリーをはてなブックマークに追加
されないだろ。つかされたら困る。
ベンチマークテストでもやってみるべ。
風呂入ってくるから後で。
>>933
ハァァ?ベンチマークとるまでもないだろ。
理性的に考えれば結果は明白。これだからベンチマーク厨は・・・




とかいう芳しいのが別のスレに居た。
>>934
まあそう言わずに、どれだけ実際に違うのか見てみましょうよ。

g++3.2.1(MinGW)で以下の関数を QueryPerformanceCounterで測定。

void dummy(const std::string& s)
{
}

void func1()
{
for (int i = 0; i < LOOP; i++)
dummy("test");
}

void func2()
{
std::string s("test");
for (int i = 0; i < LOOP; i++)
dummy(s);
}
コンパイルオプションは -O3。

LOOP = 500000 で実験。

func1 = 365125
func2 = 1944

ご覧のように、std::stringのコンストラクタを呼んだ方は100倍以上も
遅くなってしまいますた。

-O2だと
func1 = 371604
func2 = 7711

これでも全然遅いです。
933じゃないけど試してみたよ。

VC7, gcc3ともに毎回コンストラクト/デストラクトしてた。
最適化オプションつけたらvc7は5倍ぐらい速くなったけど、
gcc3は1.2倍程度だった。

stringの生成をループの外に持ってったら、
最適化オプションなしで20倍ぐらい速くなった。

ところで、foo()の中身を、引数のstringの長さをグローバル変数に足しこむ
のにしてたんだけど、
ループ外にもってったのをvc7で最適化したら、ループが無くなってました。
gcc3は残ってた。
938937:03/01/26 02:20
書いてるうちに別の方が書き込みを・・・
やってることはほぼ同じです。
>>937
VC7の方もなかなか速いね。gccは-O3にしたらループは
残るものの、callが無くなっていました。

int len;

void dummy(const std::string& s)
{
len += s.length();
}

でやったら、-O3で

func1 = 379483
func2 = 9185

という結果。これがまあ実際の使用上の差かもしれません。
940デフォルトの名無しさん:03/01/26 02:58
enumって何ナノ?定数のtypedef?
継承できないよね?
勝手にできないと思って、拡張するとき
#defineでごまかしてるんだけど。

classにstatic constならべたclassを継承すれば
継承っぽいなぁ。めんどいけど。

詳しい方ご教授ください。
enumに整数以外の型も使えたらなあ・・・
>>940
enum は列挙型で、それ自身独立した型。enum から整数には暗黙の変換が
利くけど、整数から enum や異なる enum 間の変換にはキャストが必要。

おそらく

class Foo {
public:
 enum TYPE1 { A, B, C, ... };
 virtual func(TYPE1 t);
};

なんてのがあって enum を拡張したいのだと思うけど、それは設計が腐ってる。

func() の中で t の値で処理を場合分けしていて、かつ t に対して将来の追加が
考えられるなら、処理自体をカプセル化して別のクラスに括り出すことを考えた
方が良い。

class Cmd {
public:
  virtual func(Cmd& foo) = 0;
};
// enum に対応して Cmd の派生クラスを作っておく
// Cmd 派生クラスのインスタンス生成は Factory パターンでも使って下さい

class Foo {
public:
  virtual func(Cmd* cmd);
};
943C++厨:03/01/26 13:20
enumeration
【名】《【複】enumerations》
(1)数え上げること; 列挙.
(2)目録, 表 (=list).
 by Roboword
944デフォルトの名無しさん:03/01/26 16:16
cygwin 上の g++ で

$ g++ hoge.cpp -I /hogeinc

と書いてコンパイルしてるんですが、この -I /hogeinc を書かなくても
自動的に対象ディレクトリを見てくれるようにするにはどうしたらいいですか?
知らん。
makefile工夫すれば書くのはめんどくさくないと思うが。
>>944
specs に書いておく。gcc -v すると specs ファイルのパス名分かるから、あとは
それをエディタで開いて書き換えましょう。
947944:03/01/26 16:48
>>945
make 使うまでもないちいさなプログラムのテストとかで面倒くさいんです。

>>946
できましたー!ありがとうございます!!
これは gcc ならどんな環境でも有効な方法なんでしょうか?
質問があります。
非常に日本語で表しにくいのですが…
ある範囲内の数値でIDを自動的に生成するようなクラスは
どのように実装したらよいでしょうか?
例えば、Get()で新しいIDを、Release(ID)でIDの解放を行うような
ID管理のクラスを作りたいのですが。
最初はstd::vector<bool>を使って使用中か否か管理しようかと
思ったのですが、intの全範囲で使用可能などとなると管理が
できなくなってしまうので…
皆様のご意見をお聞かせください。
>>948
それしか方法が無いと思うが。
できるのは、容量を縮めるのに bitset を応用できるくらい?
>>949
Get, Release に特定のパターンがあるなら、最適化する余地はある。たとえば
多くの場合、

 まとめて Get
 まとめて Release

するなら、

 ここから、ここまで確保されている (最小 ID と最大 ID のタプル)

っつーのを持たせた方が良い。

何の前提もつけられないとなると、完全に全範囲持たせるしかないよな…
>>948
std::set<int>、で、どう?
953デフォルトの名無しさん:03/01/27 00:33
class A
{
  A();
}
class B : public A
{
  B();
}
この場合手持ちのコンパイラでは
A::A()が先に実行されるのですが
これは規格で保証されてる事なのでしょうか?
>>953
保証されてる。デストラクタがその逆であることも。
>>954
ありがとうございます
>>928->>939の書き込みに感動しました。
実行時間の測定は、gccというかUNIXの場合timeを使うのですよね。
VCの場合、どうやって測定するのでしょうか。
>>956
トリッキーなコード2より転載。windows.hをインクルードして呼ぶ。

int prof(void (*func)())
{
__int64 start, end, freq;
HANDLE hprocess;
DWORD oldclass;

hprocess = GetCurrentProcess();
oldclass = GetPriorityClass(hprocess);

Sleep(10);
SetPriorityClass(hprocess, REALTIME_PRIORITY_CLASS);
QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
QueryPerformanceCounter((LARGE_INTEGER*)&start);

func();

QueryPerformanceCounter((LARGE_INTEGER*)&end);
SetPriorityClass(hprocess, oldclass);

return (int)(end - start);
}
958デフォルトの名無しさん:03/01/27 02:35
>>949
VC++6では既に, std::vector<bool>は1要素1bitで保持してる(はず)。
激しく環境依存だけど。
新スレ立てました C++相談室 part15
http://pc3.2ch.net/test/read.cgi/tech/1043605481/
足りないと思われるものがあるなら今のうちに次スレの
方に貼り付けておいてください。今日はもう寝ます、お休みなさい。
漏れの脳みそは足りないと思うのですが、何を貼り付ければいいですか?
汝には、当家に伝わる秘伝中の秘伝である
ありがた〜い、塗り薬を授けるので
今すぐ、頭をかちわって、脳みそを送るが良いぞ
これから頭をかち割ってみます
v(^・^)v
963 は絶息しますた。
そういえば次スレの案内がないので(またサーバー変わったみたいだし)
C++相談室 part15
http://pc2.2ch.net/test/read.cgi/tech/1043605481/l50
DeveloperStudioってVisualC++.NETについてるの?
いまVisualStudio.NETアカデミックを持ってるけど・・・
968967:03/02/06 03:42
解決しました。ありがとうございました。
age
ちょっと前に、ベンチマークに時間を計る話がありましたよね。
俺の環境では、Cygwinでtimeとするといいと思うんですが、そこで出てくる
real、user、sysの意味がよくわかりません。
実時間、ユーザー時間、システム時間って言葉ではさっぱりです。
ベンチマークになるのは、どれなんでしょう?
boost::timer
> 安く作成

(・∀・)カエレ!
>>970
real … プログラムの起動から終了までの時間
user … ユーザー側の実行に CPU が費やした時間
sys … OS側の実行に CPU が費やした時間

全体の処理時間を評価したいなら real 時間
アルゴリズムを評価したいなら user 時間
OS の機能を評価したいなら sys 時間
sage
975デフォルトの名無しさん:03/03/13 20:30
age
976デフォルトの名無しさん:03/03/14 18:36
ぬるぽ
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/  
 (_フ彡        /  ←>>976

C++相談室 part15
http://pc2.2ch.net/test/read.cgi/tech/1043605481/l50
978デフォルトの名無しさん:03/03/14 19:10
  ( `Д´)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V・∀・)/  
 (_フ彡        /  ←>>977

C++相談室 part17
http://pc2.2ch.net/test/read.cgi/tech/1047560042/
 | ̄ ̄ ̄|___
 |        ヌノ|
 |______|
    ∧∧ ||
    ( ゚д゚)||
    / づΦ
980デフォルトの名無しさん:03/03/15 01:59
 ______
 |__     |
     |レポ   |
     |___|  
    ∧∧ ||
    ( ゚д゚)||
    / づΦ
981デフォルトの名無しさん
  ( `Д´)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V・∀・)/  
 (_フ彡        /  ←>>980

C++相談室 part17
http://pc2.2ch.net/test/read.cgi/tech/1047560042/