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

3 日坊主日記


2007-03-10 [長年日記]

_ [Ruby] 可視性 (ruby-1.9)

send は public なメソッドは呼べるけど private, protected なメソッドは呼べない。

funcall は public, private なメソッドは呼べるけど protected なメソッドは呼べない。

protected が分からない。

class C
  def him
  end
  public :him

  def you
  end
  protected :you

  def me
  end
  private :me
end

require 'test/unit'

class TC < Test::Unit::TestCase
  def setup
    @i = C.new
  end

  #
  # send
  #
  def test_send_him
    y { @i.send(:him) }
  end

  def test_send_you
    n { @i.send(:you) }
  end

  def test_send_me
    n { @i.send(:me) }
  end

  #
  # funcall
  #
  def test_funcall_him
    y { @i.funcall(:him) }
  end

  def test_funcall_you
    n { @i.funcall(:you) }
  end

  def test_funcall_me
    y { @i.funcall(:me) }
  end

  private
    def y(&b)
      assert_nothing_raised(&b)
    end

    def n(&b)
      assert_raise(NoMethodError, &b)
    end
end

Rails は send も protected も使いまくってる。うー。

_ [Rails] benchmark (rails for ruby 1.9)

最低限動くようになったので benchmark をとってみた。

# Linux can.moriq.com 2.6.12-2.3.legacy_FC3smp

まず AR のみ。AR の benchmarks を元に書いた。

# 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

次に dispatch 以降全体。railsbench を元に書いた。

gem をなるべく使わない環境を用意。

  • vendor/rails (rails:freeze:gems)
  • rake on site_ruby
  • rubygems on site_ruby
  • sqlite3-ruby on site_ruby

Music model: schema としては genre:int column だけ持つ。 実際の record はひとつもない状態で計測。

musics は scaffold Music で作った controller。 musics/index は paginate limit 20 だけど record がないのであまり影響しない。

----------------------------------------
Time: Sat, Mar 10 2007 15:27:28 +0900
Ruby version: 1.8.6
                                      user     system      total        real
load environment                  0.730000   0.090000   0.820000 (  0.820679)
/musics/index                     0.810000   0.120000   0.930000 (  0.928919)
----------------------------------------
Time: 2007-03-10 14:32:31 +0900
Ruby version: 1.9.0
                                      user     system      total        real
load environment                  1.120000   0.090000   1.210000 (  1.222148)
/musics/index                     0.670000   0.120000   0.790000 (  0.795256)

n=100 なので n/real では

1.8.6: 108 req/sec
1.9.0: 126 req/sec

次に

rake db:fixtures:load

として record を 2 個置いた (genre は null)。

----------------------------------------
Time: Sat, Mar 10 2007 16:21:56 +0900
Ruby version: 1.8.6
                                      user     system      total        real
load environment                  0.740000   0.090000   0.830000 (  0.825608)
/musics/index                     1.040000   0.130000   1.170000 (  1.173964)
----------------------------------------
Time: 2007-03-10 16:20:53 +0900
Ruby version: 1.9.0
                                      user     system      total        real
load environment                  1.100000   0.120000   1.220000 (  1.216180)
/musics/index                     0.840000   0.110000   0.950000 (  1.039765)
1.8.6: 85.2 req/sec
1.9.0: 96.2 req/sec

_ KaracriBoard

成型機監視にエスアイ創房さんの KaracriBoard を購入。

# u.rb:
require 'socket'
socket = UDPSocket.new
socket.connect('192.168.0.200', 20000)
while request = gets.chomp
  socket.send(request, 0)
  begin
    response, addr = socket.recvfrom(128)
    p response
  rescue
    p $!
  end
end
$ ruby u.rb
1 hello
"1 HELLO TK0040A v1.00 MyCpuName 192.168.0.200 0004b9xxxxxx H 1234.000"
1 din
"1 DIN 000000 0000"
1 din
"1 DIN 100000 0000"
1 ain
"1 AIN 1023 1023 1023 1023 0 0"
1 ain
"1 AIN 1023 1023 1023 2 0 0"

楽しす。

[]