为什么有时File.write会变慢?

时间:2018-10-25 11:00:14

标签: ruby io

这是我的代码:

start = Time.now
File.write('/tmp/a.txt', 'Hello, world!')
puts "Saved in #{Time.now - start}"

在某些情况下,我在日志中看到了这一点:

Saved in 0.001
Saved in 0.002
Saved in 0.245
Saved in 0.002

为什么有时会出现这种峰值?那可能是什么?我不在任何地方使用flock。我怀疑是某些库重写了方法File.write()并在其中添加了一些锁定/同步。有可能吗?

更新:似乎经常访问该目录的Dir.new()阻止了对该目录的访问。

2 个答案:

答案 0 :(得分:3)

似乎Dir.new()在应用程序的另一个位置完全锁定了整个目录,并且不允许File.write()快速运行。这是重现问题的测试(使用threads gem)

require 'tmpdir'
require 'threads'
Dir.mktmpdir do |dir|
  file = File.join(dir, 'hey.txt')
  Thread.start do
    loop do
      Dir.new(dir)
    end
  end
  Threads.new(100).assert do
    start = Time.now
    File.open(file, 'w+') do |f|
      f.write('test')
    end
    puts("Saved in #{Time.now - start}")
    sleep 1
  end
end

这将工作缓慢。但是,如果将Dir.new替换为`ls #{dir}`.split(' ') ,一切都会快速进行:

Dir.glob()

Ruby错误?我不知道。

顺便说一句,function dec2hex($number) { $hexvalues = array('0','1','2','3','4','5','6','7', '8','9','A','B','C','D','E','F'); $hexval = ''; while($number != '0') { $hexval = $hexvalues[bcmod($number,'16')].$hexval; $number = bcdiv($number,'16',0); } return $hexval; } 也是如此-它也非常慢。

答案 1 :(得分:1)

我不确定,但是我很惊讶那些谈到时间的不是来自Ruby,而是来自您的底层操作系统(我猜是Linux)。

我用Python编写了与您相似的脚本,我可以看到与您相同的差异。

我使用以下命令观看系统调用

sudo strace -T -e trace=open,close,write -p <my_process_pid>

至少对于open系统调用,我还可以看到某些调用比其他调用花费100倍的时间。