我有一个这样的命令,其中 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/