浏览 669 次
|
精华帖 (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,或许就是噩梦的开始。 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2008-08-08
1和2能否都举一下具体的代码例子?
特别是1,虽然ruby很慢,但是它的数组操作也是毫秒级别的,你说的0.02秒才能从数组中获取一个对象实在难以想像。 |
|
| 返回顶楼 | |
|
时间:2008-08-08
Quake Wang 写道 1和2能否都举一下具体的代码例子?
特别是1,虽然ruby很慢,但是它的数组操作也是毫秒级别的,你说的0.02秒才能从数组中获取一个对象实在难以想像。 数组本来是做顺序查找的。遍历一个大数组会消耗很长时间。
Benchmark.realtime{
Array(1..1000000).select{|e|e==1000000}
}
#消耗时间:0.608999967575073
非顺序遍历数组的复杂度是N, 想快点考虑用hash,用内存换时间。 |
|
| 返回顶楼 | |
|
时间:2008-08-08
Quake Wang 写道 1和2能否都举一下具体的代码例子?
特别是1,虽然ruby很慢,但是它的数组操作也是毫秒级别的,你说的0.02秒才能从数组中获取一个对象实在难以想像。 顺序获取应该是毫秒级的,如果是查找,一旦数据较多,跟数据库表查询没什么区别。 |
|
| 返回顶楼 | |
|
时间:2008-08-08
如果用做数据遍历查找,大容量数组确实不合适,如dazuiba所说,想要性能的话,用hash。
|
|
| 返回顶楼 | |
|
时间:2008-08-08
有一个很有意思的想法,把
array.each do |a| # process end 换成 while (a = array.pop) do # or shift # process end 性能会有多大的提高呢? |
|
| 返回顶楼 | |
|
时间: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)
|
|
| 返回顶楼 | |
|
时间:2008-08-10
性能优化没有学到,倒是学会了 benchmark 的使用,哈哈,多谢 rainux
|
|
| 返回顶楼 | |










