一个简单的Ruby脚本冻结我的机器

Ter*_* Li 1 ruby freeze

CONSTANT = 1000000000000000000
array = (1..CONSTANT).to_a

start = Time.now
array.each do |i|
  if 1000 < i < CONSTANT * 9 / 10

  elsif i > CONSTANT * 9 / 10

  else

  end 
end
finish = Time.now

puts "Running time: #{finish - start} seconds"
Run Code Online (Sandbox Code Playgroud)

我编写了上面的脚本,试图找出通过重新排序控制分支可以节省多少时间.该脚本在运行后立即冻结我的机器,无法通过CTL + C终止.有人可以指出那里发生了什么吗?

Ale*_*lex 6

你正在迭代一个庞大的数字.

让我们说你的CPU可以每纳秒迭代一个数组项(这很好!),这意味着1e9迭代数组需要几秒钟.那是31年!

你的常数远远超过.


Dav*_*hme 5

您正在创建一个您甚至不需要的巨大阵列.这迫使你的机器开始分页(它将占用64位地址空间的5%,你的机器肯定没有那么多的RAM).你的代码没有进入循环(if语句中的条件不是有效的ruby).

CONSTANT = 1000 
# start with something small, then increase by 10 
# 10000000 works for me.

start = Time.now
CONSTANT.times do |i|
  if 1000 < i && CONSTANT * 9 / 10

  elsif i > CONSTANT * 9 / 10

  else

  end 
end
finish = Time.now

puts "Running time: #{finish - start} seconds"
Run Code Online (Sandbox Code Playgroud)

  • 更有可能的是,它耗尽了空闲内存,创建了一个包含一个五元数整数的数组. (2认同)