Please give me comments.

A compiler of Ruby 1.9 compile ruby script, without "trace
instruction" by default.  This means that some "trace event" used by
set_trace_func() is not active (line, call, leave).  "trace
instruction" invoke some hook procs.

This is a reasone of this issue:
http://redmine.ruby-lang.org/issues/show/161

lib/profile.rb enable to add trace insn.  You need to require
lib/profile.rb *before* target programs are compiled.  require *in*
target program is not affect profiling because target programs are
already compiled.  If you run ruby with profiler specified in
command line, you have correct result:

> ./ruby -v -rprofile ../trunk/test.rb
> ruby 1.9.0 (2008-07-08 revision 0) [i686-linux]
>   %   cumulative   self              self     total
>  time   seconds   seconds    calls  ms/call  ms/call  name
>  67.44     0.29      0.29     2432     0.12     4.84  Object#ackerman
>  20.93     0.38      0.09     3676     0.02     0.02  Fixnum#==
>   6.98     0.41      0.03     1188     0.03     0.03  Fixnum#+
>   4.65     0.43      0.02     2431     0.01     0.01  Fixnum#-
>   0.00     0.43      0.00        1     0.00     0.00  Module#method_added
>   0.00     0.43      0.00        1     0.00     0.00  Kernel.require
>   0.00     0.43      0.00       57     0.00     0.00  Fixnum#>
>   0.00     0.43      0.00        1     0.00     0.00  RubyVM::FrozenCore.core_define_method
>   0.00     0.43      0.00        2     0.00     0.00  IO#set_encoding
>   0.00     0.43      0.00        1     0.00   430.00  #toplevel

The reason why I eliminate "trace instruction" is performance.  In
most cases, we don't need "trace instruction".  If there is no
hooks, "trace instruction" means "nop instruction", waste some
performance.

This is a benchmark result:
http://www.atdot.net/sp/readonly/30xp3k
ruby 1.9.0 (2008-07-09 revision 17965) [x86_64-linux]

"wo-trace" is current 1.9, compile without trace instruction.
another one "ruby 1.9.0 (2008-07-09 revision 17965) [x86_64-linux]"
is modified version which include trace instruction everytime.

"wo-trace" is fast as a few percent.


But there are some drawback:
- spec changing from 1.8
- difficult to describe especially for newbe
 (or 1.8 users except ruby-core readers?)
- dave should re-write his book :)

There are some technical solutions.  One is to insert one-byte trace
instruction ([ruby-core:17653]) dynamically.  But I think we can't
support it in high-quality by 1.9.1 release.


I consier this issue and current my solutions are:

- enable (include) trace insn on 1.9.1 everytime
- speed up with one-byte trace instruction on 1.9.x (x > 1)
- you can disable to compile with trace insn by require some
  library (ruby -r without-trace-insn ...) on 1.9.1
  in concrete term, modify
  RubyVM::InstructionSequence.compile_option.
- you can write about it on performance tips page :)


Any comments?
-- 
// SASADA Koichi at atdot dot net