Jer*_*ith 41 ruby optimization profiling ruby-on-rails
我正在研究不同的优化技术,我发现这篇文章分析效率代码?有人认为对调用堆栈进行采样比使用分析器更有效.基本思想是,如果您查看调用堆栈,您会看到应用程序最有可能花费大部分时间的位置,然后在那里进行优化.
这当然很有趣,他显然是这方面的专家,但我不知道如何在ruby中查看调用堆栈.在调试器中,我可以说"信息堆栈",但似乎只显示一行.
编辑:我看到Mike Dunlavey的评论:"我只想指出,如果你在调试器下运行,手动中断它,并显示调用堆栈......"
我只是不确定如何手动中断它并调整调用堆栈.
saw*_*awa 81
刚刚放
puts caller
代码中的任何地方.如果您不喜欢它的格式,它是一个字符串数组,因此您可以对所需的输出执行一些正则表达式操作.
如何将信号发送到ruby进程,并为转储所有堆栈的信号创建处理程序?
从http://le-huy.blogspot.com/2012/04/dump-backtrace-of-all-threads-in-ruby.html我们有这样的例子:
require 'pp'
def backtrace_for_all_threads(signame)
  File.open("/tmp/ruby_backtrace_#{Process.pid}.txt","a") do |f|
      f.puts "--- got signal #{signame}, dump backtrace for all threads at #{Time.now}"
      if Thread.current.respond_to?(:backtrace)
        Thread.list.each do |t|
          f.puts t.inspect
          PP.pp(t.backtrace.delete_if {|frame| frame =~ /^#{File.expand_path(__FILE__)}/},
               f) # remove frames resulting from calling this method
        end
      else
          PP.pp(caller.delete_if {|frame| frame =~ /^#{File.expand_path(__FILE__)}/},
               f) # remove frames resulting from calling this method
      end
  end
end
Signal.trap(29) do
  backtrace_for_all_threads("INFO")
end
然后我们需要将信号发送到适当的过程:
ps afxw | grep ruby
kill -29 <pid>
ls -l /tmp/ruby*
vi /tmp/ruby_backtrace_...
在适当的采样时间重复信号.
| 归档时间: | 
 | 
| 查看次数: | 19749 次 | 
| 最近记录: |