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

yeg*_*256 5 ruby io

这是我的代码:

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

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

Saved in 0.001
Saved in 0.002
Saved in 0.245
Saved in 0.002
Run Code Online (Sandbox Code Playgroud)

为什么偶尔出现这种飙升?那可能是什么?我没有flock在任何地方使用.我怀疑是某些库已经覆盖了该方法File.write()并在那里添加了一些锁定/同步.可能吗?

更新:似乎Dir.new()经常访问目录,阻止访问它.

yeg*_*256 3

似乎Dir.new()在应用程序的另一个地方完全锁定了整个目录并且不允许File.write()快速工作。这是重现问题的测试(使用线程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
Run Code Online (Sandbox Code Playgroud)

这个会工作得很慢。然而,如果你Dir.new用这个替换,一切都会再次快速进行:

`ls #{dir}`.split(' ')
Run Code Online (Sandbox Code Playgroud)

红宝石错误?我不知道。

顺便说一句,同样如此Dir.glob()- 它也非常慢。