2008-12-24
Profilerの実験
|とりあえず、こんな感じでProfilerを作ってみました。掛かったクロック数を行毎に表示します。ソースコード兼出力結果です。yarv2llvmで実行するのはただのfibなので、そこだけクロック数が表示されています。後は、Profilerそのもののプログラムです。
以下のプログラムを実行(sample/profile_sketch.rb)すると、下のような結果が表示されます。
1: require 'yarv2llvm' 2: module YARV2LLVM 3: PROFILER_STATICS = [] 4: PROFILER_STATICS[0] = 0 5: end 6: 7: YARV2LLVM::compile(<<-EOS, {}) 8: module YARV2LLVM 9: def trace_func(event, no) 10: if event == 1 then # Line 11: if $fst == 1 then 12: get_interval_cycle 13: $fst = 0 14: end 15: next_curtime = get_interval_cycle 16: PROFILER_STATICS[no] += $curtime 17: 18: $curtime = next_curtime 19: # Profile process dont count 20: get_interval_cycle 21: end 22: end 23: end 24: 25: def fib(n) 238808 26: if n < 2 then 125921 27: 1 28: else 29: fib(n - 1) + 116821 30: fib(n - 2) 31: end 32: end 33: 34: EOS 35: 36: YARV2LLVM::TRACE_INFO.each_with_index do |n, i| 37: YARV2LLVM::PROFILER_STATICS[i] = 0 38: end 39: $fst = 1 40: $curtime = 0 41: p fib(10) 42: 43: src_content = {} 44: YARV2LLVM::TRACE_INFO.each do |n| 45: fn, ln = n[1][3].split(/:/) 46: src_content[fn] = File.readlines(fn) 47: end 48: 49: res = {} 50: YARV2LLVM::TRACE_INFO.each_with_index do |n, i| 51: fn, ln = n[1][3].split(/:/) 52: res[n[1][3]] = YARV2LLVM::PROFILER_STATICS[i] 53: end 54: 55: src_content.each do |fn, cont| 56: cont.each_with_index do |srcln, ln| 57: re = res[fn + ":" + (ln + 1).to_s].to_i 58: if re != 0 then 59: print "#{re}\t#{ln + 1}: #{srcln}" 60: else 61: print "\t#{ln + 1}: #{srcln}" 62: end 63: end 64: end 65:
追記
eを1000桁もとめるプログラムでもやってみました。そろそろオーバフローしそうなのでdoubleで計算しようとしましたが、うまく行きません。
結果は大体、腑に落ちるけど一部腑に落ちないところもあります。Profilerが悪いのかコンパイルされたコードがそうなっているのかチェックしてみます。
追記2
やっぱり間違えていた。結果を直しておきます。また、doubleで計算できるようになりました。単純な原因で変数の初期値がintだったからでした。
1: #!/bin/env ruby 2: # Compute E without bignum 3: # 4: KETA = 257 5: 6: # dst / n -> dst 7: def div(n, dst) 524010 8: i = 0 494416 9: r = 0 470995 10: while i < KETA do 152744427 11: d = dst[i] + r * 10000 127691791 12: r = d % n 190099591 13: dst[i] = d / n 141472614 14: i = i + 1 15: end 16: end 17: 18: def add(src, dst) 510488 19: i = KETA - 1 465654 20: c = 0 510625 21: while i >= 0 do 163258346 22: t = src[i] + dst[i] + c 123676676 23: c = t / 10000 199402363 24: dst[i] = t % 10000 132127975 25: i = i - 1 26: end 27: end 28: 29: def compute_e 1008 30: i = 0 1155 31: f = 1 2573 32: a = [] 1533 33: b = [] 1291 34: while i < KETA do 442317 35: a[i] = 0 435808 36: b[i] = 0 263384 37: i = i + 1 38: end 1617 39: b[0] = 1 1617 40: a[0] = 0 1029 41: n0 = 1 1092 42: while f == 1 do 510661 43: f = 0 470073 44: i = 0 487312 45: while i < KETA do 149543558 46: if b[i] != 0 then 64932626 47: f = 1 48: end 121857093 49: i = i + 1 50: end 161120547 51: add(b, a) 67951021 52: div(n0, b) 473062 53: n0 = n0 + 1 54: end 55: a 56: end
コメントを書く
トラックバック - http://d.hatena.ne.jp/miura1729/20081224/1230127971
リンク元
- 44 http://www.rubyist.net/~kazu/samidare/
- 4 http://llvmruby.org/wordpress-llvmruby/
- 3 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=com.ubuntu:ja:unofficial&q=llvm+関数&btnG=検索&lr=
- 2 http://a.hatena.ne.jp/asip/
- 2 http://a.hatena.ne.jp/fujita-y/
- 2 http://bugzero.thatsping.jp/tag/LLVM
- 2 http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=グラフ+循環+アルゴリズム&num=50
- 1 http://209.85.175.132/search?q=cache:aBjqU3HaDjEJ:d.hatena.ne.jp/miura1729/20080327+MOZ_MEMORY_WINDOWS&hl=zh-TW&ct=clnk&cd=10
- 1 http://74.125.93.104/translate_c?hl=en&sl=ja&tl=en&u=http://d.hatena.ne.jp/miura1729/20081224/1230127971&usg=ALkJrhjHlHkRhWXW6VuLr8_UgBHqVmA9Xw
- 1 http://a.hatena.ne.jp/kei-os2007/add?mode=config&pageurl=http://d.hatena.ne.jp/miura1729