« 同期/息切れ /2 | トップページ | googleとYouTube »

Profiling python with fridge / 2

前のスクリプトを改造して,抽出した関数にBreakPointを設定し,Cを連打してどの関数が何回呼ばれたかプロファイルをとってみる.

>> ベンチマークpythonスクリプト

      1 a=10
      2 b=20
      3 c=a+b
      4 print c
      5

>> fridgeスクリプトソース

      1 #!/usr/bin/fridge
      2
      3 MAXFUNCTION=100
      4
      5 #calling a process
      6 call "gdb -silent ./python" fd
      7
      8 #getting functions
      9 talk fd "info functions\n" outbuf
     10 rslice outbuf "[^ \t\n*]+[(]" "g" functions
     11
     12 #setting break points
     13 for i in functions.size :
     14     if i > MAXFUNCTION break
     15     talk fd "b "+--functions[i]+"\n" outbuf
     16     ...
     17
     18 #starting process
     19 talk fd "run test.py\n" outbuf
     20 while (talk fd "c\n" outbuf) :
     21     rslice outbuf "[^ \t\n*]+[ ][(]" "" funcname
     22     if funcname<0 break
     23     --funcname
     24     if(fTbl[funcname]==0) fLst[fLst.size]=funcname
     25     ++fTbl[funcname]
     26     ...
     27
     28 #displaying functions
     29 for i in fLst.size echo fLst[i] ":" fTbl[fLst[i]]
     30
     31 #close a process
     32 write fd "q\n"
     33 close fd

>>結果
      1 Py_Main  : 1
      2 PyObject_CallFunctionObjArgs  : 74
      3 PyObject_Call  : 688
      4 PyObject_CallFunction  : 26
      5 PyObject_CallMethod  : 27
      6 PyNumber_AsSsize_t  : 1110
      7 PyNumber_Index  : 1110
      8 PyMapping_Size  : 2
      9 PyParser_ParseStringFlagsFilename  : 10
     10 initerr  : 11
     11 PyTokenizer_FromString  : 10
     12 tok_new  : 11
     13 decode_str  : 10
     14 check_bom  : 11
     15 buf_getc  : 10
     16 buf_ungetc  : 10
     17 check_coding_spec  : 12
     18 get_coding_spec  : 12
     19 parsetok  : 11
     20 PyTokenizer_Get  : 49
     21 tok_get  : 49
     22 tok_nextc  : 148
     23 tok_backup  : 39
     24 PyTokenizer_Free  : 11
     25 PyNumber_Multiply  : 34
     26 PyIter_Next  : 359
     27 PyNumber_And  : 107
     28 PyNumber_Or  : 3
     29 PyNumber_Int  : 26
     30 PyNumber_Remainder  : 4
     31 PyNumber_Add  : 33
     32 PyNumber_Long  : 4
     33 PyObject_AsCharBuffer  : 4

real    0m7.270s
user    0m0.471s
sys     0m0.500s

うほ.これはおもしろいかも.I/O時の同期のとりかたを洗練させればもっと速くなりそう.
ftpクライアントとかに接続すれば正規表現によるダウンロードとかできて実用的にも役に立つかもしれない.

« 同期/息切れ /2 | トップページ | googleとYouTube »

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/163977/3826423

この記事へのトラックバック一覧です: Profiling python with fridge / 2:

« 同期/息切れ /2 | トップページ | googleとYouTube »