3 日坊主日記
2007-03-12 [長年日記]
_ register calling convention
Delphi の register calling convention を Ruby/DL で扱いたいという話なのだけど難しいよね。
_ [Rails] benchmark: activesupport が怪しい
# 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)
これに引っかかったのかなあ。
[ツッコミを入れる]
[]
