论坛首页 Ruby版 rails

rails有趣的性能问题

浏览 681 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (7) :: 隐藏帖 (6)
作者 正文
时间:2008-08-07 关键字: ruby rails

  今天遇到两个有趣的性能问题。

 

  1. 把所有数据都读取到一个数组,然后在内存层面去操作,每次从数组中查找一个对象耗时:0.02秒。因为数据太多,性能严重不行,完成整个操作要30分钟。试着改成每次都从数据库去find的方式来操作,每次查询也只耗时0.02秒,而且还要比内存层面的操作稍快。加个index,速度立马提升一个数量级,整个操作只需3分钟。cool!

 

  2. 一个update操作,因为数据较多,耗时将近10分钟。看了一下,一个n方的算法完全可以改成n的。后来直接改成sql去update,耗时不超过1秒钟。

 

  当然,为了性能问题,写一堆一堆的sql,或许就是噩梦的开始。

   
时间:2008-08-08
1和2能否都举一下具体的代码例子?
特别是1,虽然ruby很慢,但是它的数组操作也是毫秒级别的,你说的0.02秒才能从数组中获取一个对象实在难以想像。
   
0 请登录后投票
时间:2008-08-08
Quake Wang 写道
1和2能否都举一下具体的代码例子?
特别是1,虽然ruby很慢,但是它的数组操作也是毫秒级别的,你说的0.02秒才能从数组中获取一个对象实在难以想像。


数组本来是做顺序查找的。遍历一个大数组会消耗很长时间。
Benchmark.realtime{
 Array(1..1000000).select{|e|e==1000000}
}
#消耗时间:0.608999967575073


非顺序遍历数组的复杂度是N,
想快点考虑用hash,用内存换时间。
   
0 请登录后投票
时间:2008-08-08
Quake Wang 写道
1和2能否都举一下具体的代码例子?
特别是1,虽然ruby很慢,但是它的数组操作也是毫秒级别的,你说的0.02秒才能从数组中获取一个对象实在难以想像。


顺序获取应该是毫秒级的,如果是查找,一旦数据较多,跟数据库表查询没什么区别。
   
0 请登录后投票
时间:2008-08-08
如果用做数据遍历查找,大容量数组确实不合适,如dazuiba所说,想要性能的话,用hash。
   
0 请登录后投票
时间:2008-08-08
有一个很有意思的想法,把
array.each do |a|
# process
end

换成
while (a = array.pop) do # or shift
# process
end


性能会有多大的提高呢?
   
0 请登录后投票
时间:2008-08-08
hozaka 写道
有一个很有意思的想法,把
array.each do |a|
# process
end

换成
while (a = array.pop) do # or shift
# process
end


性能会有多大的提高呢?


显然不会有性能提升,Array#pop 和 Array#shift 会有一个 Array 修改操作,导致性能降低。

require 'benchmark'

Benchmark.bm do |x|
  x.report {
    array = Array(1..1000000)
    array.each do |e|
    end
  }

  x.report {
    array = Array(1..1000000)
    while (a = array.pop) do
    end
  }

  x.report {
    array = Array(1..1000000)
    while (a = array.shift) do
    end
  }
end


rainux@mutalisk ~
% ruby test.rb
      user     system      total        real
  0.230000   0.010000   0.240000 (  0.248797)
  0.290000   0.010000   0.300000 (  0.312698)
  0.280000   0.000000   0.280000 (  0.292774)
rainux@mutalisk ~
% ruby test.rb
      user     system      total        real
  0.260000   0.000000   0.260000 (  0.277904)
  0.280000   0.000000   0.280000 (  0.289177)
  0.280000   0.000000   0.280000 (  0.285684)
rainux@mutalisk ~
% ruby test.rb
      user     system      total        real
  0.220000   0.000000   0.220000 (  0.245022)
  0.280000   0.010000   0.290000 (  0.299613)
  0.260000   0.010000   0.270000 (  0.285374)
   
0 请登录后投票
时间:2008-08-10
性能优化没有学到,倒是学会了 benchmark 的使用,哈哈,多谢 rainux
   
0 请登录后投票
论坛首页 Ruby版 rails

跳转论坛:
JavaEye推荐