Ruby (2.0) Почему StringIO медленнее, чем использование файла - PullRequest
0 голосов
/ 29 сентября 2018

Мне нужно захватить двоичный вывод внешнего процесса.Вывод становится довольно большим, порядка ГБ.

В настоящее время я использую 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, но, находясь в памяти, я надеялся на лучшую производительность.

Ожидается ли это?Я что-то не так делаю?

...