在Ruby中读取用户输入的最快方法

在Ruby中读取用户输入的最快方法,ruby,io,Ruby,Io,我现在有一些时间,我在Ruby的SPOJ上做了一些挑战。一个困扰我的想法是我如何更快地阅读用户输入 例如,这个问题: 我尝试了许多解决方案,都基于GET: while ((i=STDIN.gets.to_i) != 42) do puts i end $stdin.each_line do |line| exit if line.strip! == "42" puts line end def input while (true) gets exit if ($_.cho

我现在有一些时间,我在Ruby的SPOJ上做了一些挑战。一个困扰我的想法是我如何更快地阅读用户输入

例如,这个问题:

我尝试了许多解决方案,都基于GET:

while ((i=STDIN.gets.to_i) != 42) do
 puts i
end

$stdin.each_line do |line|
  exit if line.strip! == "42"
  puts line
end

def input
 while (true)
  gets
  exit if ($_.chomp == "42")
  puts $_.chomp
 end
end
input
以及GET的其他变体。我得到的最佳时间是0.01秒和7.2MB的内存占用。但是,使用Ruby语言查看最佳提交,前5页都使用了0.00s和3.1Mb内存

你知道我怎样才能更快地得到输入吗?
还有,所有的测试都使用STDIN将测试用例传递给应用程序,一些非常大(数百Mb),我怀疑get对于读取这种输入来说太慢了(或者可能是chomp)。还有其他方法比gets更快吗?

我可以通过保持代码简单并知道什么是更快的方法来完成事情来获得0.0倍的速度。我不会显示我的代码,因为人们应该自己解决问题:

while ((i=STDIN.gets.to_i) != 42) do puts i end 同样,不要剥去,而是使用更聪明的比较。还有,
strip可能会咬到您。我会使用
strip
,因为它保证返回预期值

def input while (true) gets exit if ($_.chomp == "42") puts $_.chomp end end input def输入 while(true) 得到 如果($\u.chomp==“42”)退出 放入$\u.chomp 终止 终止 输入 两个
chomp
很昂贵。你应该
$\uump分别显示

需要知道的是,Ruby的正则表达式引擎非常快,锚定正则表达式模式将超过常规的instring搜索

使用Ruby的基准类测试您的代码变体,您可以缩小哪些差异有帮助


我有一个版本使用循环,非常类似于您的中间解决方案,还有一个版本是一行代码。两者都是0.0秒。

您知道方法参数不需要括号,对吗?你只是想拥有它们吗?使用Readline怎么样@DylanRichards我一直使用括号,因为我觉得它更清晰。你有没有尝试过3.1MB的ARGF,看看它们是什么时候提交的,所有<7.2MB的提交都在顶部,即使按提交日期排序也是如此。如果这是我们程序员可以控制的东西,你会看到更低的值散布在各处。我对这个问题的解决方案不感兴趣,只是一个例子。我想知道我是如何阅读输入的。对于较大的输入,是否足够快?有没有更快的阅读方法?定义“足够快”。您可以一次读取所有数据,然后必须转换为数组来迭代数据
read_lines
可以为您实现这一点,但不会加快整个处理过程。在我的测试中,
foreach
每行都非常快,避免了“slurp”和“split”。基准是确定答案的方法。
def input
 while (true)
  gets
  exit if ($_.chomp == "42")
  puts $_.chomp
 end
end
input