是否可以在Ruby中分析文件系统交互?

时间:2011-01-17 22:36:12

标签: ruby profiling io

是否可以分析Ruby应用程序以查看它与文件系统的交互程度?

后台:过去我编写的代码只需要一次就能读取循环中的文件。我想确保我删除所有这些代码。

3 个答案:

答案 0 :(得分:1)

当然,您只需在脚本顶部require 'profile

# myscript.rb
require 'profile'
Dir.entries(".").each  { |e| puts e}

$ ruby myscript.rb

(文件名列表......)

  %   cumulative   self              self     total
 time   seconds   seconds    calls  ms/call  ms/call  name
  0.00     0.00      0.00        1     0.00     0.00  Dir#open
  0.00     0.00      0.00        1     0.00     0.00  Dir#each
  0.00     0.00      0.00        1     0.00     0.00  Enumerable.to_a
  0.00     0.00      0.00        1     0.00     0.00  Dir#entries
  0.00     0.00      0.00       56     0.00     0.00  IO#write
  0.00     0.00      0.00       28     0.00     0.00  IO#puts
  0.00     0.00      0.00       28     0.00     0.00  Kernel.puts
  0.00     0.00      0.00        1     0.00     0.00  Array#each
  0.00     0.01      0.00        1     0.00    10.00  #toplevel

或者您可以在命令行中传递一个选项:

$ ruby -r profile myscript.rb

如果您希望更好地控制要分析的内容,请查看ruby-prof库。

答案 1 :(得分:1)

已经有完全有能力的程序用于此目的,您不需要复制。我不认为你应该通过特殊的逻辑检查使你的程序复杂化一个相对模糊的编程错误(至少,我从来没有意外地提交你描述的错误)。在这种情况下,解决方案是检查程序中外部的性能特征。假设您使用的是Linux,我将转向测试/规范来运行您的代码并在单独的线程中监视iostat(或类似)。

答案 2 :(得分:0)

我是蛮力的傻逼。

File.open(path, 'r') do |file|
  ...
end
File.mv(path, path + '.hidden')    # Temporary

如果代码尝试两次打开文件,则第二次找不到它。测试后,您可以使用shell one-liner逆转重命名。在Bash中(也可能在其他* nix shell中):

for i in `ls *.hidden` ; do mv $i ${i%.hidden} ; done