更快地调用kind_of?或者使用一个值迭代一个数组?

时间:2011-04-22 05:00:54

标签: ruby

简而言之,调用kind_of的成本(时间和cpu)是否更高?两次或创建一个具有一个值的新数组,然后迭代它?下面的“背景故事”只是详细说明了为什么我需要知道这一点,但不是必须阅读来回答这个问题。

Backstory

我有一堆位置数据。纬度/经度对以及它们所代表的地方的名称。我需要按照用户提供的另一个纬度/经度对的距离对这些纬度/经度值进行排序。我必须在飞行中计算距离,以前不知道它们。

我认为通过将distance => placename映射添加到散列,然后获取密钥集并对其进行排序,然后按该顺序读出值,这样做很容易。但是,两个距离相等的可能性使两个键彼此相等。

我已经提出了两个解决方案,我要么映射

if hash.has_key?(distance)
  hash[distance].kind_of? Array
   ? hash[distance] << placename
   : hash.merge!({distance => [hash[distance], placename]})
else
  hash.merge!({distance => placename})
end  

然后在阅读我检查的值时

hash[distance] kind_of? Array ? grab the placename : iterate through hash and grab all placenames 

每一次。或者我可以从一开始就使每个值成为一个数组,即使它只有一个地名。

3 个答案:

答案 0 :(得分:3)

你可能花了更多时间考虑这个问题,而不是节省CPU时间。开发人员的大脑时间(你和其他将在你离开后维护代码的人)通常比CPU周期更加珍贵。 专注于代码清晰度

如果您有迹象表明您的代码是瓶颈,那么对它进行基准测试可能是一个好主意,但不要忘记对之前和之后所做的任何更改进行基准测试,以确保您实际上正在改进代码。令人惊讶的是,“优化”根本不会改进代码,只是让代码更难阅读。

答案 1 :(得分:1)

说实话,这听起来像是一个非常微不足道的性能问题,所以我会说对你感觉更好。

如果你真的相信这对现实世界的性能有影响(坦率地说,还有其他领域的Ruby你应该更加关注速度),将你的问题减少到最简单的形式,仍然类似于你的问题并使用基准模块:

http://www.ruby-doc.org/stdlib/libdoc/benchmark/rdoc/index.html

答案 2 :(得分:0)

我敢打赌,使用内置的Enumerable#group_by方法,您将获得更高的性能和更好的易读性。

正如其他人所说,这可能不是瓶颈,在任何情况下,收益都可以忽略不计,你应该专注于其他事情!