Tag: 优化

为什么在Ruby 1.8.7中Symbol#to_proc较慢?

流行Ruby实现中Symbol#to_proc的相对性能表明,在MRI Ruby 1.8.7中, Symbol#to_proc比其基准测试中的替代品慢30%到130%,但在YARV Ruby 1.9中并非如此。 2。 为什么会这样? 1.8.7的创建者没有在纯Ruby中编写Symbol#to_proc 。 另外,有没有为1.8提供更快的Symbol#to_proc性能的gem? (当我使用ruby-prof时,符号#to_proc开始出现,所以我不认为我对过早优化感到内疚)

为什么使用String#count比使用Ruby中的String #chars更快地计数字母?

使用以下基准: def create_genome “gattaca” * 100 end def count_frequency_using_chars(sequence) 100000.times do sequence.chars.group_by{|x| x}.map{|letter, array| [letter, array.count]} end end def count_frequency_using_count(sequence) 100000.times do [“a”, “c”, “g”, “t”].map{|letter| sequence.count(letter)} end end sequence = create_genome count_frequency_using_chars(sequence) count_frequency_using_count(sequence) 我发现,在基于C的Ruby中,对于1.8和1.9.2,使用String#count(letter)比使用Enumerable#group_by和Array#count它们进行排序和计算快约50倍。 我对此感到有些惊讶,因为String#count方法每次迭代读取字符串四次,而后者只读取一次。 我尝试在ruby-prof和perftools.rb下运行代码,并且它们都只表示String#chars #chars占用了90%的时间,没有分解花费90%的时间。 如果我不得不猜测为什么会有差异,我会说创造7000万个单字符串会很昂贵,但我怎么能知道呢? ( 更新 : String#chars mainly_execute_a_trivial_block不是罪魁祸首 – 请参阅mainly_execute_a_trivial_block的基准测试) 编辑:使用1.9.2补丁级别180的当前基准: require ‘pp’ require ‘benchmark’ def create_genome “gattaca” * […]

寻找完全平方算法的优化

我正在研究的问题是: 在给定特定范围的情况下,找出哪个平方因子总和是一个完美的平方。 因此,如果范围为(1..10),您将得到每个数字的因子(所有因子为1,所有因子为2,所有因子为3等)。将这些因子平方,然后将它们加在一起。 最后检查这笔金额是否是一个完美的正方形。 我坚持重构/优化,因为我的解决方案太慢了。 这是我想出的: def list_squared(m, n) ans = [] range = (m..n) range.each do |i| factors = (1..i).select { |j| i % j == 0 } squares = factors.map { |k| k ** 2 } sum = squares.inject { |sum,x| sum + x } if sum == Math.sqrt(sum).floor ** 2 all = […]