From: "yanoh (Yutaka Yanoh)" Date: 2012-12-01T20:31:28+09:00 Subject: [ruby-dev:46676] [ruby-trunk - Bug #7356] ruby-2.0.0-preview1 で adlint-2.6.10 が性能劣化 Issue #7356 has been updated by yanoh (Yutaka Yanoh). wanabe さん、情報ありがとうございます。 下記のバージョンで再測定してみました。 * ruby 1.9.3p327 (2012-11-10 revision 37606) [i686-linux] * ruby 2.0.0dev (2012-11-01 trunk 37411) [i686-linux] <- 2.0.0-preview1 * ruby 2.0.0dev (2012-11-29 trunk 37962) [i686-linux] <- trunk 最新 == 結論 * adlint_bm (screen-4.0.3/process.c.small) では、trunk 最新 (r37962) が一番高速 * adlint_bm (screen-4.0.3/process.c) では、ruby-1.9.3p327 が一番高速 2.0.0-preview1 (r37411) よりは trunk 最新 (r37962) の方がかなり性能回復していま すが、それでも条件によっては ruby-1.9.3p327 より遅い場合があるようです。 adlint_bm のターゲット screen-4.0.3/process.c.small は、ベンチマーク時間を短縮 するためオリジナルの screen-4.0.3/process.c の大部分を削除したものです。 それぞれのターゲットで、ベンチマーク時の測定内容がかなり異なるようです。 == 測定条件 trunk の最新で adlint-2.6.10 を実行したところ、ブロック無しの Enumerator.new を 使用していたため、大量の warning が出力されました。 これが測定結果に影響を与えるかもしれないと思い、Object#to_enum に変更したものを adlint-2.6.12 としてリリースし、このバージョンで測定しました。 また、adlint_bm についても -c NUM で測定回数を指定可能にして adlint-benchmark-1.1.0 としてリリースし、このバージョンを使用しました。 == 測定結果 === "screen-4.0.3/process.c.small" ターゲット 測定コマンド : adlint_bm -p * ruby 1.9.3p327 (2012-11-10 revision 37606) [i686-linux] user system total real screen-4.0.3/process.c.small #1 16.250000 0.050000 16.300000 ( 16.434142) total 16.250000 0.050000 16.300000 ( 16.434142) * ruby 2.0.0dev (2012-11-01 trunk 37411) [i686-linux] <- 2.0.0-preview1 user system total real screen-4.0.3/process.c.small #1 21.540000 0.080000 21.620000 ( 21.800759) total 21.540000 0.080000 21.620000 ( 21.800759) * ruby 2.0.0dev (2012-11-29 trunk 37962) [i686-linux] <- trunk 最新 user system total real screen-4.0.3/process.c.small #1 15.220000 0.050000 15.270000 ( 15.392969) total 15.220000 0.050000 15.270000 ( 15.392969) === "screen-4.0.3/process.c" ターゲット 測定コマンド : adlint_bm -t "screen-4.0.3/process.c" -p * ruby 1.9.3p327 (2012-11-10 revision 37606) [i686-linux] user system total real screen-4.0.3/process.c #1 214.060000 0.470000 214.530000 (216.548791) total 214.060000 0.470000 214.530000 (216.548791) * ruby 2.0.0dev (2012-11-01 trunk 37411) [i686-linux] <- 2.0.0-preview1 user system total real screen-4.0.3/process.c #1 244.090000 0.520000 244.610000 (246.698421) total 244.090000 0.520000 244.610000 (246.698421) * ruby 2.0.0dev (2012-11-29 trunk 37962) [i686-linux] <- trunk 最新 user system total real screen-4.0.3/process.c #1 227.260000 0.310000 227.570000 (229.420830) total 227.260000 0.310000 227.570000 (229.420830) == さらに測定 "screen-4.0.3/process.c" ターゲットについて、-c NUM オプションで測定を繰り返し て見たところ、1.9.3 と 2.0.0 で動作特性が異なる傾向を持つことが分かりました。 2.0.0 では初回のみ遅くなっているようです。やはりプロファイラによる詳細な分析が 必要でしょうか。 測定コマンド : adlint_bm -t "screen-4.0.3/process.c" -c 3 -p * ruby 1.9.3p327 (2012-11-10 revision 37606) [i686-linux] user system total real screen-4.0.3/process.c #1 217.300000 0.100000 217.400000 (218.929445) screen-4.0.3/process.c #2 217.790000 0.070000 217.860000 (219.410483) screen-4.0.3/process.c #3 216.250000 0.300000 216.550000 (218.345587) total 651.340000 0.470000 651.810000 (656.685515) * ruby 2.0.0dev (2012-11-01 trunk 37411) [i686-linux] <- 2.0.0-preview1 user system total real screen-4.0.3/process.c #1 241.460000 0.180000 241.640000 (243.313287) screen-4.0.3/process.c #2 213.320000 0.120000 213.440000 (214.921192) screen-4.0.3/process.c #3 201.570000 0.050000 201.620000 (203.014434) total 656.350000 0.350000 656.700000 (661.248912) * ruby 2.0.0dev (2012-11-29 trunk 37962) [i686-linux] <- trunk 最新 user system total real screen-4.0.3/process.c #1 227.050000 0.100000 227.150000 (228.728632) screen-4.0.3/process.c #2 220.260000 0.080000 220.340000 (221.945992) screen-4.0.3/process.c #3 223.870000 0.420000 224.290000 (226.271632) total 671.180000 0.600000 671.780000 (676.946256) ---------------------------------------- Bug #7356: ruby-2.0.0-preview1 で adlint-2.6.10 が性能劣化 https://bugs.ruby-lang.org/issues/7356#change-34275 Author: yanoh (Yutaka Yanoh) Status: Feedback Priority: Normal Assignee: ko1 (Koichi Sasada) Category: Target version: 2.0.0 ruby -v: ruby 2.0.0dev (2012-11-01 trunk 37411) [i686-linux] == 現象 ruby-1.9.3-p327 と ruby-2.0.0-preview1 で adlint-2.6.10 の性能比較を行った結果、 ruby-2.0.0-preview1 の方が解析時間が 1.2 倍ほど長くかかりました。 == 再現手順 % gem install adlint % tar xvjf adlint-benchmark-screen.tar.bz2 <- 添付ファイル % cd adlint-benchmark-screen/adlint % time make -j 2 2>/dev/null == 性能測定結果 === 測定環境 * Core 2 Duo E4500 2.20GHz / 3.4GB * Fedora 14 / Linux 2.6.35.14-106.fc14.i686 === 測定方法 * 下記バージョンの ruby を用いて、adlint-2.6.10 で screen-4.0.3 を解析 ruby 1.9.3p327 (2012-11-10 revision 37606) [i686-linux] built with gcc-4.5.1 ruby 2.0.0dev (2012-11-01 trunk 37411) [i686-linux] built with gcc-4.5.1 ruby 2.0.0dev (2012-11-01 trunk 37411) [i686-linux] built with gcc-4.7.2 * すべて configure オプションは --prefix のみ * 解析は 2 コアを使い切れるよう make -j 2 を指定 * できるだけ IO による遅延を抑えるため標準エラーは /dev/null へリダイレクト ただし解析結果ファイルの出力は抑止できていません === 測定結果 * ruby 1.9.3p327 (2012-11-10 revision 37606) [i686-linux] built with gcc-4.5.1 make -j 2 2> /dev/null 1335.85s user 7.10s system 184% cpu 12:07.79 total make -j 2 2> /dev/null 1336.54s user 7.17s system 184% cpu 12:07.80 total make -j 2 2> /dev/null 1340.71s user 7.23s system 184% cpu 12:10.69 total * ruby 2.0.0dev (2012-11-01 trunk 37411) [i686-linux] built with gcc-4.5.1 make -j 2 2> /dev/null 1626.45s user 8.08s system 184% cpu 14:48.20 total make -j 2 2> /dev/null 1633.40s user 8.10s system 185% cpu 14:46.92 total make -j 2 2> /dev/null 1631.37s user 7.86s system 184% cpu 14:50.18 total * ruby 2.0.0dev (2012-11-01 trunk 37411) [i686-linux] built with gcc-4.7.2 make -j 2 2> /dev/null 1531.83s user 7.85s system 184% cpu 13:53.04 total make -j 2 2> /dev/null 1533.46s user 7.97s system 184% cpu 13:54.54 total make -j 2 2> /dev/null 1532.89s user 8.03s system 184% cpu 13:53.33 total == 備考 adlint_sma コマンドは、最初のソースコード読み込み時と最後の解析結果書き出し時に IO が走る以外は、オンメモリで計算のみを実行しています。 データ構造は木構造が多く、再帰処理を多用し、小さな一時オブジェクトを多く new し ています。 -- http://bugs.ruby-lang.org/