以前我也经常问 what?why?how?工作几年变成了技术实用主义者。没遇到问题之前很少再问那些问题。 今天被问道 map 和 map! 的性能哪个好。囧。。。 以前学校里的时候我也为技术而技术,现在为了解决问题而技术。 我并不想辩解哪个更好,只想说,进入到 ruby 这个领域就没有遇到过什么太多太深的问题:是给自己找点问题的时候了。
做过小调查:研究过 map 和 map! 哪个性能好的同学举手;实际遇到过这个问题(原因相关联就行)的同学请举手!
Fast Ruby: https://github.com/JuanitoFatas/fast-ruby Erik Michaels-Ober - Writing fast Ruby
楼主的性格适合做个人站长,不适合跟“极客”一起吹逼,见我这贴 https://ruby-china.org/topics/28321 ,现在还有用 windows 2003 + iis + php + ftp 上传,一样赚的风生水起的。
说实话,这个问题我也没有去做过
但是如果这是面试题,我想正确应该答案是:
我没有试过 map 和 map! 的性能问题,因为我觉得这两个性能差别应该不会太大,但是我对 Ruby 应用的性能问题很关注,但我觉得这样的测试只要关注别人的测试结果就足够了,关注业务逻辑优化或数据库优化的性能可以得到更多的性能回报
require 'benchmark'
array = (1..10_000_000).to_a
Benchmark.bmbm do |x|
x.report("map") { array.map { |e| e } }
x.report("map!") { array.map! { |e| e } }
end
Rehearsal ----------------------------------------
map 10.520000 0.500000 11.020000 ( 11.600892)
map! 9.500000 0.220000 9.720000 ( 9.803323)
------------------------------ total: 20.740000sec
user system total real
map 10.260000 0.430000 10.690000 ( 10.838827)
map! 9.510000 0.090000 9.600000 ( 9.727683)
大多数不加!的函数相当于先 clone 一个原对象再直接对新对象调用加!的函数,但 map 例外。map 相当于建一个新的数组,再把待 map 的元素 push 进新数组,map! 相当于直接遍历并修改数组中的元素。 个人觉得应该几乎所有函数都是加!快一点吧。
#18 楼 @jimrokliu 爆炸方法更优 主要是因为 GC《ruby performance optimization》很详细的分析介绍了