Ruby (2.0) Почему StringIO медленнее, чем файл
Мне нужно захватить двоичный вывод внешнего процесса. Выходные данные получаются довольно большими, порядка нескольких гигабайт.
На данный момент я использую Open3.popen3
следующим образом:
cmd = 'rtrace -args > file.out'
lines = [some, array, of, floats].pack('F*')
Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
stdin.puts lines.pack("F*")
stdin.close
puts wait_thr.value
end
File.open('file.out', 'rb') do |f|
# parsing binary file
end
В попытке сделать мой код быстрее, я старался не писать и не читать файл снова. Это рабочий код
stdout, status = Open3.capture2(cmd, :stdin_data => lines.pack("F*"), :binmode=>true)
rad_output = StringIO.new(stdout)
puts status
rad_output.binmode
# Parse rad_output as before
Я заметил, что мой код примерно на 30% медленнее. Я предполагаю, что это потому, что я создаю новый объект String, но, находясь в памяти, я надеялся на лучшую производительность.
Это ожидается? Я делаю что-то неправильно?