個人学習用データの読み込み所要時間のプロファイング結果 コンパイルオプションは -pg -g3 -O2。 % env LD_LIBRARY_PATH=./test/lib ./test/bin/anthy-agent --do-nothing にて計測。 .mcount の都合により、self seconds の値を4〜7倍くらいした値が、実際の消費時間。 個人学習用データの読み込み所要時間のプロファイング結果、patch4 Sat,06 Sep,2008版基準(動的リンク版) データが有る時 データが無い時 self calls self calls name seconds seconds 0.31 4510033 0.00 1549 memset MALLOC_OPTIONS=J由来 0.23 108615 0.00 1 _gettimeofday time(0)由来 0.21 4394417 0.00 1448 pubrealloc メモリ確保/メモリ解放 0.20 1959204 0.00 657 imalloc メモリ確保 0.10 1764812 0.00 578 ifree メモリ解放 0.08 ? * 0 fgetc ファイル読み込み 0.07 1142020 0.00 146 memcpy メモリ確保?文字列処理? 0.06 884540 0.00 205 strlen 文字列処理 0.03 167356 * 0 __qdivrem 数値変換 0.02 341569 * 0 strtol 数値変換 0.02 83678 * 0 strtoll 数値変換 0.02 884423 0.00 88 malloc メモリ確保 0.00 83678 * 0 __udivdi3 数値変換 0.00 83678 * 0 __umoddi3 数値変換 0.00 5841 0.00 30 malloc_pages メモリ確保 0.00 4253 0.00 21 sbrk メモリ確保 0.00 4252 0.00 20 brk メモリ確保 0.00 1331 0.00 17 _read 0.00 1319 0.00 5 __srefill 0.00 1318 0.00 4 __sread 0.00 1318 0.00 4 _sread 0.00 1314 * 0 __srget 0.02 * * * その他 1.37 * 0.03 * (TOTAL) 1.06 * 0.03 * (TOTAL:MALLOC_OPTIONS=jz 相当) 分析: ・memset() がやたら多いのは、デバッグの為に MALLOC_OPTIONS=AJv している為。 標準設定の MALLOC_OPTIONS=jz に戻せば 23%高速化する。 以下の消費時間割合は、MALLOC_OPTIONS=jz相当換算で算出。 ・memcpy() は、realloc() なのか anthy_xstr なのか不明。 ・メモリ確保で 41%、メモリ解放で 9%、合計で 50%消費。 ・time(0) だけで 22%消費。 ・文字列処理(たぶん xstrがらみ)で 12%消費。 ・ファイルの読み込みそれ自体で 8%消費。 ・数値データの読み込みで 7%消費。 結論: ・細切れのメモリを大量に取り扱う anthy_xstrの構造が、負荷になっているらしい。 ・原作形式の学習データの変換時に、スコアリング初期値として毎回 time(0) している部分が結構重いらしい。22%くらい食ってる。 → これは治す予定。 ・学習データをバイナリ化しても、せいぜい1〜2割の高速化だと思われる。 個人学習用データの読み込み所要時間のプロファイング結果、patch4 Sun,12 Oct,2008版基準(time(0)修正、動的リンク版) 0.19 4432873 pubrealloc [5] 0.19 1967472 imalloc [12] 0.10 1772918 ifree [20] 0.09 fgetc [17] 0.06 1142294 memcpy [24] 0.05 884519 strlen [28] 0.03 19 strdup [7] 0.03 344311 strtol [36] 0.02 167988 __qdivrem [37] 0.02 1339 _read [38] 0.02 55 free [10] 0.01 884420 malloc [11] 0.01 83994 strtoll [34] 0.01 4259 brk [47] 0.01 9 realloc [16] 0.00 83994 __umoddi3 [42] 0.00 atoi [35] 0.00 atoll [33] 0.00 83994 __udivdi3 [45] 0.00 5766 malloc_pages [46] 0.00 4260 sbrk [69] 0.00 1327 __srefill [39] 0.00 1326 __sread [1145] 0.00 1326 _sread [40] 0.00 1322 __srget [41] 0.85 * (TOTAL:MALLOC_OPTIONS=jz 相当) 結論: ・patch4 Sat,06 Sep,2008版よりも 20%速くなりました。 ・回数が増えていますが、この文章を書いた分、学習データが増えている為です。 ・realloc() 回数が間違っている。多分 692483 だと思う。 ・dlmalloc() や ptmalloc() を使うと、非スレッドセーフモード限定ならば、ここからさらに2割速くなる。非スレッドセーフなので、GTK+ や Qt で使うと壊れると思う。 ・dlmalloc() や ptmalloc() をスレッドセーフモードで使うと、ここから2割遅くなる。 個人学習用データの読み込み所要時間のプロファイング結果、patch4 Sun,12 Oct,2008版基準(静的リンク版) 0.58 40793757 bit_test [11] 0.21 108828 anthy_smalloc [8] 0.20 4473271 pubrealloc [12] 0.20 1976202 imalloc [16] 0.12 6892830 trie_key_nth_bit [22] 0.10 5269643 pushchar [26] 0.09 5439371 fgetc [25] 0.09 1781442 ifree [27] 0.07 5269644 mygetc [20] 0.07 109883 trie_insert [7] 0.06 283369 anthy_cstr_to_xstr [19] 0.06 82764 anthy_read_line [10] 0.06 884515 strlen [31] 0.04 1142679 memcpy [36] 0.04 200004 trie_find [23] 0.03 1249468 search [37] 0.03 309888 anthy_xstrcmp [38] 0.03 347154 strtol [40] 0.02 884382 strdup [15] 0.02 168654 __qdivrem [41] 0.02 84327 strtoll [33] 0.02 1562949 malloc [17] 0.02 1267257 realloc [21] 0.01 1643065 free [18] 0.01 1249468 anthy_euc_to_ucs [35] 0.01 461763 do_get_nr_values [46] 0.01 165527 anthy_free_line [24] 0.01 1348 _read [47] 0.01 108817 trie_key_first_diff_bit_1byte [51] 2.30 * (TOTAL:MALLOC_OPTIONS=jz 相当) malloc realloc 回数 サイズ 回数 サイズ 37233 0 26799 2 22424 3 9715 4 102471 4 8354 5 8289 6 7236 7 342137 8 89999 8 6186 9 6186 10 5484 11 59219 12 170879 12 1288 13 639 14 463 15 50245 16 83200 16 307 17 307 18 225 19 38673 20 72134 20 163 21 163 22 123 23 29013 24 122749 24 97 25 97 26 75 27 22345 28 49605 28 55 29 55 30 37 31 17949 32 48600 32 27 33 27 34 20 35 13991 36 74540 36 13 37 13 38 11 39 10997 40 23723 40 1 41 8 41 1 42 8 42 4 43 8943 44 10852 44 2 45 2 46 1 47 1 47 7213 48 60462 48 1 49 1 50 1 51 6084 52 4797 52 5115 56 4788 56 2 57 4123 60 53795 60 3310 64 4781 64 2809 68 4780 68 2171 72 28998 72 1572 76 4777 76 1157 80 4777 80 768 84 28798 84 632 88 4777 88 348 92 4777 92 236 96 15881 96 128 100 4777 100 116 104 4777 104 34 108 15536 108 32 112 24 116 20 120 5052 120 4 124 5044 132 3 140 5044 144 5037 156 7 160 5036 168 10 180 5033 180 5033 192 4 200 5033 204 5033 216 5 220 5033 228 2 240 5033 240 5033 252 12 256 1 260 5033 264 8 273 8 274 8 275 5041 276 8 277 7 278 7 279 1 280 7 280 7 281 7 282 6 283 6 284 6 285 5 286 4 287 5037 288 4 289 4 290 4 291 4 292 4 293 7 294 6 295 6 296 6 297 6 298 6 299 1 300 6 300 5 301 5 302 5 303 5 304 5 305 5 306 5 307 4 308 4 309 3 310 3 311 3 312 3 313 3 314 3 315 3 316 1 317 1 318 1 319 1 320 1 321 1 322 1 580 2597 2048 1 2344 回数 場所 サイズ 691867 realloc: ../../src-diclib/ruleparser.c:200 4〜108 691867 free: ../../src-diclib/ruleparser.c:280: 450984 realloc: ../../src-worddic/record.c:877 12〜288 283597 malloc: ../../src-diclib/xstr.c:183 8 → 学習データの単語数とほぼ一致、省略の余地無し 283597 malloc: ../../src-diclib/xstr.c:188 0〜124 → 学習データの単語数とほぼ一致、省略の余地無し 283511 free: ../../src-diclib/xstr.c:279: 283511 free: ../../src-diclib/xstr.c:280: 192459 free: ../../src-worddic/record.c:1412: 165527 free: ../../src-diclib/ruleparser.c:282: 127913 realloc: ../../src-worddic/record.c:1081 2〜52 108845 malloc: ../../src-diclib/xstr.c:262 4〜124 21927 free: ../../src-worddic/record.c:1153: 2597 malloc: ../../src-diclib/alloc.c:127 2048 1625 free: ../../src-worddic/record.c:1246: 1624 free: ../../src-worddic/record.c:1199: 1614 free: ../../src-worddic/record.c:1114: 293 malloc: ../../src-splitter/depgraph.c:253 0〜580 293 free: ../../src-splitter/depgraph.c:315: 239 realloc: ../../src-diclib/conf.c:117 273〜322 96 free: ../../src-ordering/exception_word_list.c:92: 96 free: ../../src-ordering/exception_word_list.c:108: 15 malloc: ../../src-diclib/alloc.c:185 32 12 malloc: ../../src-diclib/conf.c:72 12 malloc: ../../src-diclib/conf.c:128 12 free: ../../src-diclib/conf.c:156: 10 malloc: ../../src-diclib/xstr.c:243 8 10 malloc: ../../src-diclib/xstr.c:246 4〜12 10 free: ../../src-worddic/record.c:1182: 10 free: ../../src-worddic/record_sub.inc:331: 10 free: ../../src-worddic/record_sub.inc:332: 7 malloc: ../../src-worddic/record.c:765 68 4 free: ../../src-diclib/conf.c:95: 2 malloc: ../../src-worddic/priv_dic.c:106 2 free: ../../src-worddic/priv_dic.c:110: 2 malloc: ../../src-worddic/textdict.c:37 1 malloc: ../../src-diclib/filemap.c:93 1 malloc: ../../src-splitter/depgraph.c:280 1 free: ../../src-splitter/depgraph.c:317: 1 malloc: ../../src-worddic/priv_dic.c:88 1 malloc: ../../src-worddic/priv_dic.c:96 1 free: ../../src-worddic/priv_dic.c:99: 1 malloc: ../../src-worddic/priv_dic.c:395 1 malloc: ../../src-worddic/record.c:2143 48 1 malloc: ../../src-worddic/record.c:2148 48 1 free: ../../src-ordering/exception_word_list.c:111: 1 free: ../../src-diclib/alloc.c:227: 個人学習用データの読み込み所要時間のプロファイング結果、patch5 Mon,13 Oct,2008版基準(動的リンク版) 0.17 1646662 imalloc [12] 0.10 3137410 pubrealloc [5] 0.09 fgetc [13] 0.07 1425691 ifree [19] 0.05 902628 memcpy [24] 0.05 897596 strlen [25] 0.03 340428 strtol [32] 0.03 166728 __qdivrem [34] 0.03 83364 strtoll [23] 0.02 897497 malloc [10] 0.02 19 strdup [7] 0.01 55 free [11] 0.00 atoll [22] 0.00 83364 __udivdi3 [35] 0.00 83364 __umoddi3 [36] 0.00 7770 malloc_pages [64] 0.00 6532 sbrk [65] 0.00 6531 brk [66] 0.00 1320 _read [1142] 0.00 1309 __srefill [53] 0.00 1307 __sread [1143] 0.00 1307 _sread [1144] 0.00 1304 __srget [54] 0.66 * (TOTAL:MALLOC_OPTIONS=jz 相当) 結論: ・patch4 Sun,12 Sep,2008版よりも 20%速くなりました。patch4 Sat,06 Sep,2008版からなら 40%高速化。 ・realloc() 回数が間違っている。多分 65057 だと思う。 ・pubrealloc() 回数3割減で消費時間半減なのは、減少回数の半分が realloc() 回数である為だと考えられる。 ・回数が増えていますが、この文章を書いた分、学習データが増えている為です。 ・メモリ消費量が増えている筈だが、調べるの忘れた。 ・学習データをバイナリ化すると、1〜2割の高速化かもしれない。 個人学習用データの読み込み所要時間のプロファイング結果、patch7 Thu,16 Oct,2008版基準(動的リンク版) 0.10 2057295 memcpy [9] 0.06 2049960 __fread [8] 0.02 248015 imalloc [13] 0.02 2 fread [7] 0.02 fgetc [15] 0.01 6631 brk [18] 0.00 95 malloc [11] 0.00 271472 pubrealloc [10] 0.00 24730 ifree [30] 0.00 6653 malloc_pages [17] 0.00 6473 strtol [31] 0.00 atoi [23] 0.00 6632 sbrk [59] 0.00 1961 read [60] 0.00 1950 __srefill [35] 0.00 1948 __sread [1140] 0.00 1948 _sread [1141] 0.23 * (TOTAL:MALLOC_OPTIONS=jz 相当) 結論: ・patch5 Mon,13 Oct,2008版よりも 65%速くなりました……ほんとかよ?。patch4 Sun,12 Oct,2008版からなら約73%高速化……ほんとうに?。 [ End of File ]