Ruby sysread IO 太慢了

标签 ruby linux api io

我有一个这样的命令,其中 input 是一个接收输入的字符串:

STDIN.sysread(1000,input)

如果它读取超过 100 个字符,则需要超过 0.1 秒。

我用 partialread 和非阻塞读取以及 read 等替代方案进行了尝试,但到目前为止我还没有找到更快的替代方案。

你知道有什么更快的方法来阅读这篇文章吗?


t=Time.now
STDIN.sysread(1000,input)
stdin_time=Time.now-t

stdin_time 大于 0.1 if input.length > 100

我在 X-Window 中从终端读取鼠标移动。

sysread 是否在完成执行之前等待比可用输入更多的输入?


即使这样也行不通:

t=Time.now
Thread.new{
    input=STDIN.sysread(1000)
}.join(0.001)
stdin_time=Time.now-t

stdin_time 仍然 >0.01,就像以前一样。


移动鼠标时,0.01 秒在屏幕上可见。这不仅是一个理论上的数字问题,而且是可见的。问题肯定在那里。

最佳答案

您的基准测试设置可能有些奇怪。首先想到的是您的发件人可能写得不够快。

以下基准测试(使用 benchmark-ips )导致在我使用了 4 年的 Macbook Ruby 2.2.5 上大约每 1.3 微秒读取一次。

此基准测试包含额外的代码来验证我们是否正在准确读取 1000 个字符的字符串。这使得基准测试速度慢了近 50%,但仍然比您声称的快很多

require 'benchmark/ips'

sysread_1k_strings = 0
read_1k_strings = 0

Benchmark.ips do |x|
  input = ''

  x.warmup = 0

  x.report('sysread') {
    STDIN.sysread(1000, input)
    sysread_1k_strings += 1 if input.length == 1000
  }

  x.report('read') {
    STDIN.read(1000, input)
    read_1k_strings += 1 if input.length == 1000
  }

end

puts "Comparison --------------------------------------"
puts "sysread".rjust(20) + "#{sysread_1k_strings.to_s.rjust(11)} 1000 byte strings read"
puts "read".rjust(20) + "#{read_1k_strings.to_s.rjust(11)} 1000 byte strings read"

当从 /dev/zero 读取时,这导致了以下基准测试结果:

$ ruby benchmark.rb < /dev/zero
Warming up --------------------------------------
             sysread     1.000  i/100ms
                read     1.000  i/100ms
Calculating -------------------------------------
             sysread    210.517k (±13.5%) i/s -    915.780k in   4.529414s
                read    475.210k (±10.4%) i/s -      1.956M in   4.209967s
Comparison --------------------------------------
             sysread     915780 1000 byte strings read
                read    1955737 1000 byte strings read

关于Ruby sysread IO 太慢了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39983890/

相关文章:

linux - pm_runtime_put_sync() 函数的功能是什么?

android - 如何在 WINDOWS 上使 APK 独立于 Kivy 和 python?

c - 无法正确解释 c 程序中 system() 的返回值

api - 仅用于 API 的 SSL 证书还是客户需要它们?

ruby-on-rails - 是否可以在 Gemfile 中让一组从另一组继承

sql - 如何在Ruby中继承父方法中获取子类?

api - 尝试查询 API,但 api 响应为空

javascript - 使用变量在 Angular 服务中调用 API

mysql - 如何使用 Rails 工具构建 SQL 'OR' 查询?

ruby - 如何在 Ruby Net :HTTP? 中处理多部分 http 响应