トップ «前の日記(2007-03-10) 最新 次の日記(2007-03-15)» 編集

3 日坊主日記


2007-03-12 [長年日記]

_ [Ruby] ruby-1.9 profiler

profiler ほしい!

_ register calling convention

Delphi の register calling convention を Ruby/DL で扱いたいという話なのだけど難しいよね。

_ [Rails] benchmark: activesupport が怪しい

先日の benchmark

# sqlite3-ruby select (n=1000)
ruby-1.8.6: 2142 req/sec
ruby-1.8.6: 2153 req/sec
ruby-1.9.0: 2313 req/sec
ruby-1.9.0: 2328 req/sec
# activerecord -> sqlite3-ruby select (n=1000)
ruby-1.8.6: 1098 req/sec
ruby-1.8.6: 1103 req/sec
ruby-1.9.0:  801 req/sec
ruby-1.9.0:  806 req/sec

と興味深い結果を得たのだけど、どうも activesupport が怪しい。

# sqlite3-ruby select (n=1000) with require 'active_record'
ruby-1.8.6: 1936 req/sec
ruby-1.8.6: 1931 req/sec
ruby-1.9.0: 1550 req/sec
ruby-1.9.0: 1565 req/sec

require するだけでこのありさま。

vendor/builder/blankslate.rb で Kernel.method_added Object.method_added を書き換えてるのが効いてるのかも。

少なくとも特化命令は有効。

module Builder
  BlankSlate = ::BasicObject

にしてみたけど、変わらないなあ。なんだろう。

計測の結果、次のライブラリを require すると速度低下が顕著。

  • builder
  • core_ext
  • dependencies
  • reloadable
  • deprecation
  • multibyte

ってほとんど全部なんだけど。

でも benchmark に影響するのはなんでかなあ。 Benchmark.measure 自体が影響を受けているのだろうか。

# benchmarks/bm3.rb:
require 'benchmark'

RUNS = 1000

require 'sqlite3'

$:.unshift(File.dirname(__FILE__) + '/../lib')
require 'active_record'

$VERBOSE = nil

File.delete "test3.db" rescue nil
db3 = SQLite3::Database.open( "test3.db" )
db3.execute "create table foo (a,b)"
db3.execute "insert into foo values (1,2)"
db3.execute "insert into foo values (3,4)"
db3.execute "insert into foo values (5,6)"

puts
puts "queries"

runtime = Benchmark.measure do |x|
  RUNS.times do
    db3.execute "select * from foo"
  end
end

puts "Rehearsal"
puts "Runs: #{RUNS}"
puts "Avg. runtime: #{runtime.real / RUNS}"
puts "Requests/second: #{RUNS / runtime.real}"

runtime = Benchmark.measure do |x|
  RUNS.times do
    db3.execute "select * from foo"
  end
end

puts "Runs: #{RUNS}"
puts "Avg. runtime: #{runtime.real / RUNS}"
puts "Requests/second: #{RUNS / runtime.real}"

db3.close

_ 青画面

 IRQL_NOT_LESS_OR_EQUAL

 STOP: 0x0000000A (0XCDCDCD,0x00000002,0x00000001,0x804DDC9A)

これに引っかかったのかなあ。

_ sqlite3-ruby benchmark

sqlite3-ruby-bench-1.jpg

bm3: sqlite3-ruby のみ
bm3as: require 'active_record' あり
[]