From 75cdbc5b10d4813316b38a3588829debadc7fb7d Mon Sep 17 00:00:00 2001 From: Paul Kmiec Date: Mon, 22 May 2023 21:10:08 -0700 Subject: Use #== and #eql? from BasicObject Prior to https://github.com/caxlsx/caxlsx/pull/223, SimpleTypeList was just an object and inheritied #== / #eql? from BasicObject. These versions are fast as they just compare whether two objects sit in the same memory location. After https://github.com/caxlsx/caxlsx/pull/223, we started to inherit #== / #eql? from Array. These are slow as they crawl all the elements in the Array. This commit restores the original version of #== / #eql?. --- lib/axlsx/util/simple_typed_list.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/axlsx/util/simple_typed_list.rb b/lib/axlsx/util/simple_typed_list.rb index c3910fca..e74e25e3 100644 --- a/lib/axlsx/util/simple_typed_list.rb +++ b/lib/axlsx/util/simple_typed_list.rb @@ -15,6 +15,12 @@ module Axlsx undef_method name end + # We often call index(element) on instances of SimpleTypedList. Thus, we do not want to inherit Array + # implementation of == / eql? which walks the elements calling == / eql?. Instead we want the fast + # and original versions from BasicObject. + alias :== :equal? + alias :eql? :equal? + # Creats a new typed list # @param [Array, Class] type An array of Class objects or a single Class object # @param [String] serialize_as The tag name to use in serialization -- cgit v1.2.3 From 5dea3e7092fb3a4667cbb50a9885d0ec4aed77b7 Mon Sep 17 00:00:00 2001 From: Paul Kmiec Date: Tue, 23 May 2023 18:02:47 -0700 Subject: Add benchmark with merge cells This is an extreme case, but it really shows the impact of merging cells. --- test/benchmark.rb | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/test/benchmark.rb b/test/benchmark.rb index d5ccdf64..fb4d7050 100755 --- a/test/benchmark.rb +++ b/test/benchmark.rb @@ -11,9 +11,22 @@ input1 = (32..126).to_a.pack('U*').chars.to_a # these will need to be escaped input2 = (65..122).to_a.pack('U*').chars.to_a # these do not need to be escaped 10.times { row << input1.shuffle.join } 10.times { row << input2.shuffle.join } -times = 3000 +times = 3_000 Benchmark.bmbm(30) do |x| + x.report('axlsx_merged_cells') do + p = Axlsx::Package.new + p.workbook do |wb| + wb.add_worksheet do |sheet| + times.times do + sheet << row + sheet.merge_cells(sheet.rows.last.cells) + end + end + end + p.serialize("example_axlsx_merged_cells.xlsx") + end + x.report('axlsx_noautowidth') do p = Axlsx::Package.new p.workbook do |wb| @@ -85,4 +98,4 @@ Benchmark.bmbm(30) do |x| end end end -File.delete("example.csv", "example_streamed.xlsx", "example_shared.xlsx", "example_autowidth.xlsx", "example_noautowidth.xlsx", "example_zip_command.xlsx") +File.delete("example_axlsx_merged_cells.xlsx", "example.csv", "example_streamed.xlsx", "example_shared.xlsx", "example_autowidth.xlsx", "example_noautowidth.xlsx", "example_zip_command.xlsx") -- cgit v1.2.3