DBIC の初期化速度改善(by Algorithm::C3 0.02)
DBIC のスキーマをたくさん(20数個かな)定義したモジュールを use しただけの単純なスクリプトに DProf によるプロファイラをかけてみました。
Algorithm::C3 0.01 時代のプロファイリングがこれ。
Total Elapsed Time = 9.335981 Seconds User+System Time = 9.315981 Seconds Exclusive Times %Time ExclSec CumulS #Calls sec/call Csec/c Name 58.3 5.436 5.436 18829 0.0003 0.0003 Algorithm::C3::_merge 21.4 1.995 7.823 491 0.0041 0.0159 Class::C3::_calculate_method_dispa tch_table 9.95 0.927 0.927 491 0.0019 0.0019 Class::C3::_remove_method_dispatch _table 3.83 0.357 0.357 491 0.0007 0.0007 Class::C3::_apply_method_dispatch_ table 2.61 0.243 0.243 37658 0.0000 0.0000 Class::C3::__ANON__ 1.66 0.155 5.834 18829 0.0000 0.0003 Algorithm::C3::merge 1.50 0.140 9.288 29 0.0048 0.3203 Class::C3::reinitialize 0.85 0.079 0.333 88 0.0009 0.0038 DBIx::Class::Componentised::ensure _class_loaded 0.42 0.039 0.058 22 0.0018 0.0026 DBIx::Class::ResultSourceProxy::Ta ble::table 0.40 0.037 0.964 29 0.0013 0.0333 Class::C3::_remove_method_dispatch _tables 0.32 0.030 0.059 6 0.0050 0.0098 DBIx::Class::Componentised::BEGIN 0.21 0.020 0.030 3 0.0067 0.0100 vars::BEGIN 0.21 0.020 0.066 5 0.0040 0.0133 DBIx::Class::ResultSource::Table:: BEGIN 0.21 0.020 0.019 7 0.0028 0.0027 Encode::BEGIN 0.20 0.019 0.019 223 0.0001 0.0001 UNIVERSAL::isa
Algorithm::C3 0.02 では…
Total Elapsed Time = 5.167620 Seconds User+System Time = 5.157620 Seconds Exclusive Times %Time ExclSec CumulS #Calls sec/call Csec/c Name 31.5 1.625 3.299 491 0.0033 0.0067 Class::C3::_calculate_method_dispa tch_table 28.6 1.478 1.679 491 0.0030 0.0034 Algorithm::C3::merge 18.5 0.958 0.958 491 0.0020 0.0020 Class::C3::_remove_method_dispatch _table 6.75 0.348 0.348 491 0.0007 0.0007 Class::C3::_apply_method_dispatch_ table 3.90 0.201 0.201 7888 0.0000 0.0000 Class::C3::__ANON__ 2.52 0.130 4.815 29 0.0045 0.1660 Class::C3::reinitialize 1.14 0.059 0.296 88 0.0007 0.0034 DBIx::Class::Componentised::ensure _class_loaded 0.95 0.049 0.095 46 0.0011 0.0021 base::import 0.91 0.047 1.005 29 0.0016 0.0347 Class::C3::_remove_method_dispatch _tables 0.76 0.039 0.039 223 0.0002 0.0002 UNIVERSAL::isa 0.72 0.037 0.036 171 0.0002 0.0002 DBIx::Class::AccessorGroup::_mk_gr oup_accessors 0.58 0.030 0.058 5 0.0060 0.0116 DBIx::Class::ResultSource::Table:: BEGIN 0.56 0.029 5.258 3 0.0097 1.7525 main::BEGIN 0.39 0.020 0.049 6 0.0033 0.0081 DBIx::Class::Componentised::BEGIN 0.35 0.018 0.048 22 0.0008 0.0022 DBIx::Class::ResultSourceProxy::ad d_columns
テスト機は Pen3 1GHz でちょっと昔な世代なんですが,2倍の高速化となりました。ちゃんとベンチマークをとったわけではないので数値としての信頼性は微妙ですが,Algorithm::C3::merge と Class::C3::__ANON__ が膨大に呼び出されていたところが改善されていることがわかるとおもいます。