更快打电话给kind_of?或通过一个值迭代数组?

| 简而言之,调用kind_of的成本(时间和CPU)是否更高?两次还是用一个值创建一个新数组,然后遍历它?下面的“背景故事”仅详细说明了为什么我需要知道这一点,但不是回答问题的必读内容。 背景故事: 我有一堆位置数据。纬度/经度对及其代表的地点的名称。我需要按照与用户提供的另一对经纬度的距离对这些经度/纬度值进行排序。我必须实时计算距离,而这些距离以前是未知的。 我想通过将ѭ0映射添加到哈希表,然后获取键集并对其进行排序,然后按该顺序读出值,将很容易做到这一点。但是,存在两个距离相等的可能性,使两个关键点彼此相等。 我为此提出了两种解决方案
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 
每一次。或者,我可以使每个值从一开始就成为一个数组,即使它只有一个地名也是如此。     
已邀请:
老实说,这听起来像是一个非常微不足道的性能问题,所以我想说,随便什么对您来说都更好。 如果您真的相信这会对现实世界的性能产生影响(坦率地说,您应该更关注Ruby的其他方面的速度),将问题简化为仍然类似于您的问题的最简单形式,并使用Benchmark模块: http://www.ruby-doc.org/stdlib/libdoc/benchmark/rdoc/index.html     
与考虑节省CPU时间相比,您花了更多时间在考虑这个问题上。开发人员的大脑时间(无论您还是其他人,在您离开时都会维护代码)通常比CPU周期宝贵得多。专注于代码清晰度。 如果有迹象表明您的代码是瓶颈,最好对其进行基准测试,但不要忘记在进行任何更改之前和之后进行基准测试,以确保您实际上在改进代码。令人惊讶的是,“优化”根本没有改善代码,只是使其变得更难阅读。     
我敢打赌,使用内置的
Enumerable#group_by
方法,您将同时获得更高的性能和更好的可读性。 正如其他人所说,这可能不是瓶颈,在任何情况下收益都是微不足道的,您应该专注于其他事情!     

要回复问题请先登录注册