From 1e36da1453722955128d1e4bcbc85f81baa60a6c Mon Sep 17 00:00:00 2001 From: Peter Leitzen Date: Tue, 7 Jan 2025 11:20:41 +0100 Subject: [PATCH 1/2] Optimize merging line coverage Prior this change `Integer#to_i` and `NilClass#to_i` showed up in stack profiler which resulted to slow down `merge_line_coverage` a lot. This change brought down the run time from 1m28s to 1m18s on a large resultset (GitLab). --- lib/simplecov/combine/lines_combiner.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/simplecov/combine/lines_combiner.rb b/lib/simplecov/combine/lines_combiner.rb index 92241f18..811a58ca 100644 --- a/lib/simplecov/combine/lines_combiner.rb +++ b/lib/simplecov/combine/lines_combiner.rb @@ -30,12 +30,12 @@ def combine(coverage_a, coverage_b) # # @return [Integer || nil] def merge_line_coverage(first_val, second_val) - sum = first_val.to_i + second_val.to_i - - if sum.zero? && (first_val.nil? || second_val.nil?) - nil - else - sum + if first_val && second_val + first_val + second_val + elsif first_val + first_val.zero? ? nil : first_val + elsif second_val + second_val.zero? ? nil : second_val end end end From bc059fcbc79fe6b2ed8265a2bd21d13903cf17ae Mon Sep 17 00:00:00 2001 From: Peter Leitzen Date: Tue, 7 Jan 2025 11:56:07 +0100 Subject: [PATCH 2/2] Improve performance for Combine.combine Create less intermediate objects. --- lib/simplecov/combine/lines_combiner.rb | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/simplecov/combine/lines_combiner.rb b/lib/simplecov/combine/lines_combiner.rb index 811a58ca..b449eb3e 100644 --- a/lib/simplecov/combine/lines_combiner.rb +++ b/lib/simplecov/combine/lines_combiner.rb @@ -10,11 +10,9 @@ module LinesCombiner module_function def combine(coverage_a, coverage_b) - coverage_a - .zip(coverage_b) - .map do |coverage_a_val, coverage_b_val| - merge_line_coverage(coverage_a_val, coverage_b_val) - end + coverage_a.map.with_index do |coverage_a_val, index| + merge_line_coverage(coverage_a_val, coverage_b[index]) + end end # Return depends on coverage in a specific line