浅析Ruby中的Profiling工具的用法_ruby专题

内置的profiler实现的很简单,在ruby2.2中只有150行代码,大家可以看看它的实现profile.rb 。内置的profiler使用起来非常的方便,只需要加上-rprofile参数即可。例如:

执行:

ruby -rprofile test.rb

输出结果为:

通过打印出的结果能够很明显的看出耗时的方法。内置的profiler很简单,只能打印出这样的结果,没有 其他输出格式的选项,下面介绍的其他几种都有丰富的格式输出。
ruby-prof

repo: https://github.com/ruby-prof/ruby-prof

ruby-prof具有C扩展,所以它能运行的更快,同时它支持丰富的输出格式,方便我们去查找性能瓶颈。 ruby-prof支持输出GraphViz支持的dot格式,两者的安装方法如下:

gem install ruby-prof

ubuntu | sudo apt-get install graphviz
Mac  | brew install graphviz

执行命令很简单,如下:

ruby-prof --mode=wall --printer=dot --file=output.dot test.rb 25

此命令的详细使用方法请参考帮助信息ruby-prof --help。

上面命令的执行结果会输出一个graphviz的dot文件,graphviz提供一个格式转换命令,可以将此文件 转换为一个pdf文件以方便查看,如下:

dot -T pdf -o output.pdf output.dot

这样就可以打开output.pdf查看程序内的方法调用占比了。


perftools.rb

repo: https://github.com/tmm1/perftools.rb

perftools.rb是google-perftools的ruby版本,不过它只支持ruby2.1以下版本,2.1及以上 版本就需要用到下面的stackprof了,这两个工具都是一个人写的。鉴于此,我们略过perftools.rb, 作者实现stackprof,就是为了替代perftools.rb。如果有需求的话,就请参考其github主页。
stackprof

repo: https://github.com/tmm1/stackprof

stackprof只支持Ruby2.1+,不过现在ruby的版本发布很快,每一个版本都能带来一些新东西,2.1 应该很快就能成为很基础的版本,我们就在这个版本上来做一些测试。

安装:

gem install stackprof

这次我们直接在代码中使用stackprof的方法:

require 'stackprof'

def m1
 5_000_000.times{ 1+2+3+4+5 }
end

def m2
 1_000_000.times{ 1+2+3+4+5 }
end

StackProf.run(mode: :cpu, out: 'tmp/stackprof.dump') do
 m1
 m2
end

我们执行这个ruby程序,ruby test.rb,会在当前目录的tmp目录中产生一个文件stackprof.dump, 然后来分析以下这个文件,stackprof命令本身可以解析这个文件,执行下面的命令:

stackprof tmp/stackprof.dump --text

则会产生下面的结果,结果应该是很清晰的,很明显在代码中m1方法要占有绝大部分的运行时间。

==================================
 Mode: cpu(1000)
 Samples: 75 (0.00% miss rate)
 GC: 0 (0.00%)
==================================
   TOTAL  (pct)   SAMPLES  (pct)   FRAME
    62 (82.7%)     62 (82.7%)   block in Object#m1
    13 (17.3%)     13 (17.3%)   block in Object#m2
    75 (100.0%)      0  (0.0%)   <main>
    75 (100.0%)      0  (0.0%)   block in <main>
    75 (100.0%)      0  (0.0%)   <main>
    62 (82.7%)      0  (0.0%)   Object#m1
    13 (17.3%)      0  (0.0%)   Object#m2

其他更加丰富的输出方式和分析方式,就请参考stackprof的github主页,讲解的很全面。

如果你希望在web前端中展示相关信息,就请看看stackprof-webnav这个gem,它提供了比较全面的 展示,操作等等,适合在一些web应用中使用,github地址:stackprof-webnav
rack-mini-profiler

repo: https://github.com/MiniProfiler/rack-mini-profiler

rack-mini-profiler专门应用于基于rack的web应用的性能调优,在rails中的使用方法如下:

首先将gem添加到gemfile中:

gem 'rack-mini-profiler'

执行:

bundle install

然后重启你的服务器,访问任意的URl,在页面上的左上角会看到响应时间的毫秒数。如下图所示:

点击query time(ms)列中的1 sql则可以查看到执行的sql语句及耗时:

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索ruby
ruby argv用法、ruby unless的用法、ruby puts用法、profiling、ribosome profiling,以便于您获取更多的相关知识。

时间: 2024-11-10 00:22:51

浅析Ruby中的Profiling工具的用法_ruby专题的相关文章

详解Ruby中的循环语句的用法_ruby专题

Ruby 中的循环用于执行相同的代码块若干次.本章节将详细介绍 Ruby 支持的所有循环语句.Ruby while 语句语法 while conditional [do] code end 当 conditional 为真时,执行 code.while 循环的 conditional 通过保留字 do.一个换行符.反斜线 \ 或一个分号 ; ,来与 code 分离开. 实例 #!/usr/bin/ruby $i = 0 $num = 5 while $i < $num do puts("I

浅析Ruby中的类对象的概念_ruby专题

 面向对象的程序涉及类和对象. 一个类是蓝本,从个别对象被创建.在面向对象的术语,我们说小明的自行车是被称为自行车类的对象实例. 任何车辆的例子.它包括轮子,马力,燃油或燃气罐容量.这些特点形成的类车辆的数据成员.可以从其他车辆区分这些特征. 车辆也有一定的功能,如停止,驾驶,超速驾驶.即使这些功能形成的类车辆的数据成员.因此,可以定义一个类作为一个组合的特点和功能. 车辆类可以被定义为: Class Vehicle { Number no_of_wheels Number horsepower

深入讲解Ruby中Block代码快的用法_ruby专题

Block 定义 some_array.each { |value| puts value + 3 } sum = 0 other_array.each do |value| sum += value puts value / sum end     A block is somewhat like the body of an anonymous method     Block can take parameters     Block 只有被 method 调用时才会起作用,如果 meth

浅析Ruby的源代码布局及其编程风格_ruby专题

使用 UTF-8 作为源文件编码.     每个缩进级别使用两个 spaces (又名软 tabs). 不要硬 tabs # bad - four spaces def some_method do_something end # good def some_method do_something end     使用 Unix-风格 换行符.(*BSD/Solaris/Linux/OSX 用户被为默认涵盖,Windows 用户必须特别小心.)         \n是换行,英文是LineFeed

Ruby中使用正则表达式的基础指引_ruby专题

正则表达式的内建支持通常只限于脚本语言如Ruby,Perl和awk等,这是一个耻辱:尽管正则表达式很神秘,但它是一个强大的文本处理工具.通过内建而不是通过程序库接口来支持它,有很大的不同. 正则表达式只是一种指定字符模式的方法,这个字符模式会在字符串中进行匹配.在Ruby中,通常在斜线之间(/pattern/)编写模式(pattern)来创建正则表达式.同时,Ruby就是Ruby,正则表达式是对象并且可以当作对象来操作. 比如,可以使用如下的正则表达式来编写模式,它会匹配包含Perl或Pytho

进一步深入Ruby中的类与对象概念_ruby专题

Ruby是纯面向对象的语言,所有项目似乎要Ruby中为一个对象.Ruby中的每个值是一个对象,即使是最原始的东西:字符串,数字甚至true和false.即使是一个类本身是一个对象,它是Class类的一个实例.本章将通过所有功能涉及到Ruby的面向对象. 类是用来指定对象的形式,它结合了数据表示和方法操纵这些数据,转换成一个整齐的包.在一个类的数据和方法,被称为类的成员.Ruby类的定义: 定义一个类,定义的数据类型的草图. 这实际上并不定义任何数据,但它定义的类名字的意思什么,即是什么类的对象将

Ruby中操作文件的方法介绍_ruby专题

 Ruby提供了一套完整的I/O相关的内核模块中实现方法.所有I/O方法来自IO类. 类IO提供了所有的基本方法,如 read, write, gets, puts, readline, getc 和 printf. 本章将涵盖所有可供在Ruby中使用的基本I/O功能.如需使用更多的功能,请参考Ruby的IO类.puts 语句: 在前面的章节中,你指定值的变量和然后使用声明 puts 输出. puts 把语句指示程序显示存储在变量值.这将添加一个新行,每行末尾写出(输出). 例子: #!/usr

Ruby中对一元操作符重载实例_ruby专题

一元操作大家都知道,就是表达式的操作符只有一个输入值.这个在C和Java中都很常见.今天我们要探讨一下Ruby中的一元操作符重载. 一元操作符有:+ – * ! & 等,为了避免与数值的 + – 混淆,重载一元操作符,要在后面加上一个 @ 操作符. 1. 一个简单的一元操作符重载例子:-@ 操作符我们以String类为例子.String默认没有定义 – 操作符: 复制代码 代码如下: 1.9.3p125 :027 > a = "Hello" => "Hel

Ruby中遍历目录的简洁方法_ruby专题

在ruby中我们要实现遍历指定目录的方法,网上的方法也非常之多,我们可以拿来参考参考,如下边的traverse.rb文件内容所示: 复制代码 代码如下: #!/usr/bin/ruby def traverse(filepath)     if File.directory?(filepath)       puts "Dirs:" + filepath       Dir.foreach(filepath) do |filename|         if filename != &