のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,062,837人
昨日:no data人
今日:
最近の注目
人気の最安値情報

    私的良スレ書庫

    不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitter
    ログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。

    元スレGCCについて part8

    gcc スレッド一覧へ / gcc とは? / 携帯版 / dat(gz)で取得 / トップメニュー
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : - pragma + - spec + 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
    レスフィルター : (試験中)
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter
    651 : デフォルトの名無 - 2008/12/18(木) 02:28:22 (-6,-29,-7)
    実は1行目が#!ccだったりしてw
    652 : デフォルトの名無 - 2008/12/21(日) 15:44:40 (+62,+29,-65)
    g++のコンパイルが異常に遅くなってしまってるんですが、
    何がボトルネックになっているのかを調べる(コンパイラ自身のプロファイルみたいなの)
    はありますか?

    コンパイルしているのは、ユニットテスト的なテストプログラムで、
    長さも100行程度です。ひたすら関数の結果をチェックしまくるみたいなもので、
    マクロを使いまくっているんですがそれが原因かなぁ・・・
    653 : デフォルトの名無 - 2008/12/21(日) 15:45:39 (+56,+28,-11)
    書き忘れましたが、その100行程度のユニットテストプログラムで、
    コンパイルには3分くらいかかってます。

    本体プログラムよりはるかに長い・・・orz
    654 : デフォルトの名無 - 2008/12/21(日) 15:51:45 (+91,+29,-32)
    可能なら前半と後半で2つのモジュールに分けて、どっちで遅くなるか調べる。
    それを繰り替えして突き止めるとか。最終手段かもだが。
    655 : デフォルトの名無 - 2008/12/21(日) 16:01:17 (+46,-17,-2)
    -Eだとどれくらいかかってるんだろ?
    656 : デフォルトの名無 - 2008/12/21(日) 16:08:56 (+35,-30,-19)
    1. -E, -S, -cでそれぞれの時間を確かめる。
    2. cc1内部は-fdump-rtl-allで出力ファイルのタイムスタンプを見る
    657 : デフォルトの名無 - 2008/12/21(日) 16:32:33 (+67,+29,-2)
    >>654 >>655 >>656
    あざっす。いまからいろいろ調べてみます。
    658 : デフォルトの名無 - 2008/12/21(日) 17:10:27 (+5,-28,-14)
    templateでたらいまわし関数みたいなものを作っているとかだったり。
    659 : デフォルトの名無 - 2008/12/21(日) 17:21:19 (+3,-29,-35)
    >>658
    テンプレートをガンガン使ってるなら、まぁ遅くなっても納得するんですが・・・

    コンパイルしているプログラムが、
    ASSERT_TRUE( .xxxx )
    ASSERT_TRUE( yyyy )
    みたいなものが延々と続いているだけのプログラムなので不可解なのです
    660 : デフォルトの名無 - 2008/12/21(日) 18:25:36 (+9,-30,-171)

    time コマンドで実行時間を測定しました。

    -c  81.34s user 12.30s system 97% cpu 1:35.78 total
    -S  82.63s user 11.62s system 99% cpu 1:34.66 total
    -E  0.36s user 0.17s system 99% cpu 0.533 total

    それぞれ一回しかやってないのでちょっと揺れがありますが…
    つまり-Eは一瞬で、asに時間がかかっているという解釈で正しいんでしょうか?

    ひょっとしてプリプロセッサによってファイルが膨れ上がっているのかとも思いましたが、
    他のファイルでも-E 後の行数はほぼ同じだったので、単純に行数が原因ではないようです。
    (すべて 50k~60k行の範囲内)

    次に-fdump-rtl-allを付けてコンパイルしようとしましたが…
    ディスク領域不足でコンパイル中断しましたとか出る上に30分経ってもまだ終わらない…
    661 : デフォルトの名無 - 2008/12/21(日) 18:30:50 (+57,+29,-38)
    アサートの数を減らしてみて
    どこを減らせばどのくらい時間が変わるか見てみたら?
    662 : デフォルトの名無 - 2008/12/21(日) 18:35:33 (+5,-29,-35)
    > つまり-Eは一瞬で、asに時間がかかっているという解釈で正しいんでしょうか?

    どう見てもcc1だろ時間かかってるのは。

    -Q ってオプションがあるので試してみ。
    663 : デフォルトの名無 - 2008/12/21(日) 19:00:41 (+23,-11,-5)
    -Sの時間が-cよりかかってるってことは、コードが相当大きくなってる?
    664 : デフォルトの名無 - 2008/12/21(日) 19:51:11 (+61,+27,-4)
    プリプロセスだけして出てきたコードはどれくらいになっとるかね
    665 : デフォルトの名無 - 2008/12/21(日) 20:20:12 (+66,+29,-38)
    どんな最適化しているの?
    でかいファイルでインタープロシージャルな最適化まで
    やったら結構重くなるだろ。
    666 : デフォルトの名無 - 2008/12/21(日) 20:34:10 (+5,-29,-85)
    >>663
    これは誤差範囲だと思います。一回しか測定してないので

    >>662
    -Q を試してみます。

    #if 0 したりしていろいろ測定してみました。どうも、ASSERT_XXXXの個数と
    だいたい相関があるようなので、1つ1つのコンパイルが遅いような気配です。
    マクロの中身を減らせないかどうか検討中です。
    667 : デフォルトの名無 - 2008/12/21(日) 20:35:40 (+57,+29,-14)
    アサートマクロの実装がマズかったりすんじゃないのかね。意外と。
    668 : デフォルトの名無 - 2008/12/21(日) 20:37:50 (+47,-29,-60)
    >>664
    プリプロセス後のコードは50k行程度です。
    一般的に見て多いのか少ないのかよくわからないですが、
    他の、数秒でコンパイルが終わるような同列のソースファイルも
    行数はさほど変わらないので、行数そのものは関係ない気がしています

    >>665
    autoconfまかせだったので、-O2の最適化がかかってました。
    テストコードだし、-O0にしてみます
    669 : デフォルトの名無 - 2008/12/21(日) 20:40:14 (+64,+29,-38)
    >>668
    ヘッダファイルの部分を除いた行はどのくらい?

    あと、マクロは常に1行に展開されるので、
    単に行数だけ見るより、バイト数見た方がいいかもしんない。
    670 : デフォルトの名無 - 2008/12/21(日) 21:24:47 (+14,-29,-60)
    >>660
    システムタイム大きすぎ!ほとんどI/Oだろ。
    -vでcc1の引数見て、テンポリファイルの中見てみ。
    超巨大になっているに違いない。
    もしかしてtemplate引数に正定数の荒しで特殊化爆発?
    671 : デフォルトの名無 - 2008/12/22(月) 00:29:25 (+3,-30,-101)
    -pipe してみて改善するようなら、特殊化の嵐でオブジェクトサイズがとんでもないことになってて
    I/Oで時間喰ってるんじゃない?コンパイル中にメモリとスワップがどうなってるか見てもいいかも。
    今時のマシンでcc1plusに80秒以上とか・・・。gccのinsn-*.cのコンパイルはそのくらいかかってたけど。
    672 : デフォルトの名無 - 2008/12/22(月) 08:34:32 (+54,-30,-64)
    gdbでさ、

    struct foo;
    struct foo { ... };

    と構造体の前方宣言があると、先に見つけた定義を見てしまって構造体の中身を
    print でダンプできず <incomplete type> になってしまうのだけど、結局
    これって解決不能なの?

    毎回同じ構造の別名構造体をダミーで仕込んで、変数ごとにキャストして
    アクセスとかって超面倒なんだけど。
    673 : 670 - 2008/12/22(月) 09:53:03 (+94,+29,-18)
    まさに的を射たと思ったんだが反応がない(ワラ
    674 : デフォルトの名無 - 2008/12/22(月) 15:45:05 (+75,+29,-141)
    >>673
    反応遅れましたが、前にも書いているとおりテンプレート一切使ってないんです。
    (boost::scoped_ptrは使ってますが、それはほかの異常ない部分でも一緒なので)

    特定のどこかが遅いということではなく、調子のってマクロを使いすぎて
    ソースの量が爆発しているような気配です。
    地道にマクロを削って最適化を抑止して頑張ってます。
    675 : デフォルトの名無 - 2008/12/22(月) 23:50:26 (+87,+28,-17)
    >>672
    ちょっと簡単な例でやってみたら別に問題ない。 具体的なサンプルコードよろ。
    676 : デフォルトの名無 - 2008/12/23(火) 00:02:54 (+56,+28,-36)
    gdbはinfoのどこかに、関数のプロトタイプ宣言書くなら、
    ファイルのはじめの方に書きなと書いてあって笑った記憶があるが…
    677 : デフォルトの名無 - 2008/12/23(火) 00:10:56 (+50,-30,-62)
    >>675
    具体的なコードはちょっと出すの難しい。Linuxの動作を
    gdb -c /proc/kcoreで追いかけてたら途中で<incomplete type>になる構造体が
    出てきたという経緯で、自分のコードじゃないから。

    -http://stackoverflow.com/questions/232744/how-to-print-incomplete-type-variable-in-gdb
    -http://sourceware.org/ml/gdb/1998/msg00116.html

    あたりがソースかな。gdb struct incomplete type でググると同様の話がゾロゾロ出てくる。
    678 : デフォルトの名無 - 2008/12/23(火) 01:16:19 (+68,-5,-70)
    >>677
    -http://sourceware.org/ml/gdb/1998/msg00116.html

    1998年? お前バカか? そんな古い断片の情報で>>672みたいな結論出すなよ。
    その状況は今のgcc/ldでは起こらない問題。 >>675というのはカーネルモジュールとか
    特殊なリンク環境で起こるんじゃないか? あと、

    -http://stackoverflow.com/questions/232744/how-to-print-incomplete-type-variable-in-gdb

    は前方参照のことは何も書いてないぞ。 本当に>>677で見たコードには前方参照があったのか?
    単にopaqueな参照だったんでは?
    679 : デフォルトの名無 - 2008/12/23(火) 11:23:39 (+67,+29,-25)
    >>678
    古い記事を出してしまったのはすまない。

    最近(2006年あたり)でも類似の話があるので出してしまったのだけど、
    ちょっと込み入った話なので質問撤回します。お騒がせしてすみません。
    680 : デフォルトの名無 - 2009/01/18(日) 15:18:11 (+24,-30,-128)
    EclipseからMinGWを呼び出してC言語のプログラムを書いているのですが、
    "-ansi"オプションを指定しても、なぜかC99の機能が使えて困っています。
    具体的には、配列の動的確保がなぜかできます。(↓のような機能)

    int i = 10;
    int array[i];

    他のC99の機能(新しいコメント分の書式やfor文での変数初期化)は無効になっていますので
    これはバグなんでしょうか?
    ちなみにgccのバージョンは、「gcc (GCC) 3.4.5 (mingw-vista special r3)」です。
    681 : デフォルトの名無 - 2009/01/18(日) 15:34:24 (+47,-29,+0)
    >>680
    -std=c89
    682 : デフォルトの名無 - 2009/01/18(日) 16:04:32 (+2,-29,-14)
    >他のC99の機能(新しいコメント分の書式やfor文での変数初期化)は無効になっていますので
    むしろこっちの方がバグなんじゃ
    683 : デフォルトの名無 - 2009/01/18(日) 16:07:37 (-1,-29,+1)
    >>682
    C89+GCC拡張なんじゃね
    684 : デフォルトの名無 - 2009/01/18(日) 16:11:42 (-1,-29,-13)
    -ansi 指定してもその程度なのか。
    やはり -pedantic-errors -Wall をつけないとダメなのか。
    685 : デフォルトの名無 - 2009/01/18(日) 16:19:34 (+32,+2,+0)
    >>681
    できました!!ありがとうございます!
    686 : デフォルトの名無 - 2009/01/18(日) 16:27:04 (+44,+26,+0)
    バグ呼ばわりか
    687 : デフォルトの名無 - 2009/01/18(日) 16:33:50 (+57,+29,-6)
    他のコンパイラで使う時に困るので、けったいな独自拡張はやめて下さい。
    688 : 680 - 2009/01/18(日) 16:38:49 (+68,+29,-60)
    >>681
    できたと思ったのですが、またもや可能になってしまいました。
    どうやらMinGWではなく、Eclipseのプラグインにバグがある気がします。
    お騒がせいたしました。
    689 : デフォルトの名無 - 2009/01/18(日) 16:40:10 (+27,-29,+0)
    だからpandanticだって
    690 : デフォルトの名無 - 2009/01/18(日) 16:46:42 (+7,-29,-7)
    >>688
    -std=c89 -pedantic-errors -Wall
    691 : 680 - 2009/01/18(日) 16:52:34 (+61,+29,-33)
    >>689-690
    ありがとうございます、今度こそ表示されたようです。
    レスも良く読まずにすみませんでした。
    692 : デフォルトの名無 - 2009/01/18(日) 17:02:14 (+55,+27,-4)
    全ては自分以外のバグが原因だからなw
    693 : デフォルトの名無 - 2009/01/18(日) 17:21:14 (+51,+28,-14)
    しかもレスもよく読まない。
    694 : デフォルトの名無 - 2009/01/25(日) 11:07:08 (-11,-29,+0)
    4.3.3
    695 : デフォルトの名無 - 2009/02/01(日) 04:57:11 (+12,-29,-8)
    gcc 4.3.3のビルド・インストールをしたのですが、
    間違えて、prefix=/usrにしてしまっていたのですが、
    一度、アンインストールしたいのですが、
    どうすればいいでしょうか?
    696 : デフォルトの名無 - 2009/02/01(日) 05:52:47 (+22,-5,-8)
    以前入れてたバージョンを再ビルドすればいいんじゃねえの?
    697 : デフォルトの名無 - 2009/02/01(日) 17:56:31 (-1,-29,-2)
    >>695
    GCCにあったかどうか記憶してないけど
    make uninstall
    が効くかもしれない
    698 : デフォルトの名無 - 2009/02/01(日) 18:29:08 (+5,-29,-39)
    >>695
    もう一回make installして、何をinstallしたかファイルに保存

    手作業

    cppに依存しているものも結構あるから、
    普及する前にrebootしない方がいい。
    699 : デフォルトの名無 - 2009/02/01(日) 20:48:45 (+47,+19,-5)
    その作業を自動化するスクリプトって書けそうだけど
    700 : デフォルトの名無 - 2009/02/01(日) 21:13:35 (-1,-29,-2)
    INSTALL変数を上書きすればいいと思うけど、
    まあ結局、目でチェックする必要あるから。
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / gcc スレッド一覧へ
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : - pragma + - spec + 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

    類似してるかもしれないスレッド


    トップメニューへ / →のくす牧場書庫について