‘Binary’ タグのついている投稿

プロファイラ gprof の使い方

2009 年 3 月 26 日 木曜日

gprof GNU Profiler とは

プロファイラあるプログラム中で使用される関数毎に、その実行回数や実行時間を分析して表示するツールです。プログラムが思ったようなパフォーマンスが出ない場合、ボトルネックになっている場所を特定するために利用します。

実行例

  %   cumulative   self              self     total
 time   seconds   seconds    calls  ms/call  ms/call  name
  0.0       0.00     0.00        3     0.00     0.00  read [1] //read()が3回
  0.0       0.00     0.00        2     0.00     0.00  write [2] //write()が2回 呼ばれている
  0.0       0.00     0.00        1     0.00     0.00  ___sysctl [138]
  0.0       0.00     0.00        1     0.00     0.00  _close [139]
  0.0       0.00     0.00        1     0.00     0.00  _mcleanup (140)
  0.0       0.00     0.00        1     0.00     0.00  _profil [141]
  0.0       0.00     0.00        1     0.00     0.00  moncontrol [3]
  0.0       0.00     0.00        1     0.00     0.00  open [4]
  0.0       0.00     0.00        1     0.00     0.00  sysctl [5]

それぞれ、

  • 実行時間(全体に対する %)
  • 実行時間の累積(秒)
  • 実行時間(秒)
  • 関数の実行された回数
  • 1回の関数実行にかかる時間(ミリ秒)
  • 1回の関数実行にかかる時間の合計(ミリ秒)
  • 関数名

を表しています。

使い方

gprofを使うには「-pg」オプションをつけてコンパイルする必要があります。

$ gcc -pg -o test.o test.c

あとは、実行ファイルを普通に実行します。このとき、gprofのデータファイルが同じディレクトリに生成されます。

$ ./test.o

「gprof 実行ファイル データファイル」とすると、解析結果が出力されます。

$ gprof test.o test.o.gmon

参考文献

Debug Hacks -デバッグを極めるテクニック&ツール
Debug Hacks
GNU Make 第3版
GNU Make 第3版

参考URL

Makefile中の環境変数を無視する

2009 年 3 月 26 日 木曜日

Makefile中の環境変数を無視する

「-e」オプションでMakefile中で設定されている環境変数を上書きすることができる。

サンプルMakefile

CFLAGS = -O -Wall

a.out: main.c
$(CC) $(CFLAGS) main.c -o $@

make

$ make //普通にmake
cc -O -Wall main.c -o a.out

$ export CFLAGS=” //CFLAGSをなしに
$ touch main.c
$ make -e
cc main.c -o a.out

「-e」オプションの説明
Makeファイル中の変数を上書きする。

-e Specify that environment values override macro assignments within
makefiles for all variables.

参考文献

GNU Make 第3版
GNU Make
CとGNU開発ツールによる組み込みシステムプログラミング 第2版
CとGNU開発ツールによる組み込みシステムプログラミング
GNUソフトウェアプログラミング ―オープンソース開発の原点
GNUソフトウェアプログラミング

Intelコンパイラicc ベンチマーク

2006 年 3 月 26 日 日曜日

IntelCompilerとは

  • Intelが作ってるコンパイラ
  • IntelのCPU用にいろいろ最適化が行われるためパフォーマンスが向上する

IntelCompilerのインストール

  1. Intel® C++ Compiler for Linuxのダウンロードページからダウンロードできます。容量が200MB近くあるので注意が必要です。
  2. 個人利用の場合は、「Free Non-comercial Download」を選択します。
    Intel Compiler ダウンロード

    Interl Compiler ダウンロード

  3. 注意事項に「Accept(同意)」します
    Intel Compiler ダウンロード

    Intel Compiler ダウンロード

  4. インストール
    $ ./install.sh
    $ source /bin/iccvars.sh(.csh)
    $ source /bin/idbvars.sh(.csh)
  5. ldconfigの設定。icc用のライブイラリをライブラリのパスに加える
    # vi /etc/ld.so.conf.d/icc.conf
    /opt/intel/cc/9.0/lib ← 追記

    # /sbin/ldconfig

iccのgccとの比較

apache + PHPをgcc/iccでコンパイルし、pukiwikiのindex.phpを1秒間に何回表示できるか計測した。

ベンチマーク環境

CPU Intel(R) Pentium(R) 4 CPU 1.60GHz cpuinfo
Memory 512MB
OS CentOS4 Linux 2.6.9-34.EL
gcc gcc バージョン 3.4.5
icc Version 9.0
apache Apache/1.3.34 (Unix)
pukiwki 1.4.6
PHP 4.4.2 (apacheにstatic リンク)

apacheの設定

KeepAliveをONにしてTCPのハンドシェイクのオーバーヘッドを無視できるようにした。
これでiccの効果をなるべくはっきり示せると思う。

MaxClients 150
KeepAlive On

コンパイルオプション

コンパイルオプションは-O3フラグのみ。

gccの場合のオプション

$ export CFLAGS=”-O3″; ./configure; make

iccの場合のオプション。環境変数CCにiccを指定すればiccでコンパイルされる。

$ export CC=icc; CFLAGS=”-O3″
$ ./configure; make

ベンチマーク結果

結果、iccのほうが16%ほど多くページを表示できた。CC=iccとするだけでも、とりあえず効果はあるようだ。
Apacheの速度がボトルネックになっている場合には、iccを試してみる価値はあると思う。

gccとicc比較

gccとicc比較

参考文献


参考URL