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

时间:2013-12-28 01:20:28

标签: ruby io

我现在有一些时间,我在Ruby中用SPOJ做了一些挑战。有人认为困扰我的是我如何更快地阅读用户输入。

例如,此问题:http://www.spoj.com/problems/TEST/

我尝试了很多解决方案,都基于获取:

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

以及其他与gets的变化。我得到的最佳时间是0.01秒,内存占用量为7.2 Mb。但是,使用Ruby语言查看最佳提交的前5页都是0.00s和3.1Mb的内存。

知道如何更快地获得输入吗? 此外,所有测试都使用STDIN将测试用例传递给应用程序,有些非常大(数百Mb),我怀疑获取这种输入的速度太慢(或者可能是chomp)。还有其他方式比获取更快吗?

1 个答案:

答案 0 :(得分:0)

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

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

唉。不要将检索到的字符串转换为整数,只是为了将其与42进行比较。相反,与'42'进行比较,请记住,可以在字符串上获得尾随行结尾。

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

同样,不要strip,而是使用更智能的比较。此外,如果字符串中没有任何更改,strip! 可以咬你,返回nil而不是您期望的字符串。我会改用strip,因为它可以保证返回预期值。

def input
 while (true)
  gets
  exit if ($_.chomp == "42")
  puts $_.chomp
 end
end
input

两个chomp代价很高。你应该$_.chomp!分开。

要知道的是,Ruby的正则表达式引擎非常快,并且锚定的正则表达式模式将超过常规的字符串搜索。

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

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