Skip to content

Commit

Permalink
shared string should be faster than non-shared string serialization
Browse files Browse the repository at this point in the history
  • Loading branch information
ochko committed Apr 3, 2012
1 parent 9950bce commit 78e2f07
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 16 deletions.
4 changes: 4 additions & 0 deletions lib/axlsx/stylesheet/color.rb
Expand Up @@ -72,5 +72,9 @@ def to_xml_string(str = '')
str << "/>"
end

def signature
"#{@rgb}:#{auto}:#{@tint}"
end

end
end
17 changes: 8 additions & 9 deletions lib/axlsx/workbook/shared_strings_table.rb
Expand Up @@ -30,8 +30,9 @@ def unique_count
# @param [Array] cells This is an array of all of the cells in the workbook
def initialize(cells)
cells = cells.flatten.reject { |c| c.type != :string || c.value.nil? || c.value.start_with?('=') }
@index = 0
@count = cells.size
@unique_cells = []
@unique_cells = {}
@shared_xml_string = ""
resolve(cells)
end
Expand All @@ -53,15 +54,13 @@ def to_xml_string
def resolve(cells)
cells.each do |cell|
cell_hash = cell.shareable_hash
index = @unique_cells.index do |item|
item == cell_hash
end
if index == nil
cell.send :ssti=, @unique_cells.size
@shared_xml_string << '<si>' << cell.run_xml_string << '</si>'
@unique_cells << cell_hash
else
if index = @unique_cells[cell_hash]
cell.send :ssti=, index
else
cell.send :ssti=, @index
@shared_xml_string << '<si>' << cell.run_xml_string << '</si>'
@unique_cells[cell_hash] = @index
@index += 1
end
end
end
Expand Down
11 changes: 5 additions & 6 deletions lib/axlsx/workbook/worksheet/cell.rb
Expand Up @@ -154,7 +154,7 @@ def u=(v) set_run_style :validate_boolean, :u, v; end
# @param [String] The 8 character representation for an rgb color #FFFFFFFF"
def color=(v)
@color = v.is_a?(Color) ? v : Color.new(:rgb=>v)
@has_run_style = true
@is_text_run = true
end

# The inline sz property for the cell
Expand Down Expand Up @@ -203,6 +203,7 @@ def scheme=(v)
# @option options [String] color an 8 letter rgb specification
# @option options [Symbol] scheme must be one of :none, major, :minor
def initialize(row, value="", options={})
@signature = 0
self.row=row
@font_name = @charset = @family = @b = @i = @strike = @outline = @shadow = nil
@condense = @u = @vertAlign = @sz = @color = @scheme = @extend = @ssti = nil
Expand All @@ -223,10 +224,7 @@ def initialize(row, value="", options={})
# equality comparison to test value, type and inline style attributes
# this is how we work out if the cell needs to be added or already exists in the shared strings table
def shareable_hash
self_hash = {}
INLINE_STYLES.each { |style| self_hash[style] = self.instance_variable_get("@" + style) }
self_hash['color'] = self_hash['color'].instance_values if self_hash['color']
self_hash
"#{@signature} & #{@value} & #{@color && @color.signature}"

This comment has been minimized.

Copy link
@jurriaan

jurriaan Apr 3, 2012

What is happening here?
Isn't it better/faster to use real hashes (String#hash / equivalents). Just appending a few strings seems very inefficient/hackish ;)

end

# @return [Integer] The index of the cell in the containing row.
Expand Down Expand Up @@ -339,8 +337,9 @@ def to_xml_string(r_index, c_index, str = '')

# Utility method for setting inline style attributes
def set_run_style( validator, attr, value)
return unless INLINE_STYLES.include?(attr.to_s)
return unless idx = INLINE_STYLES.index(attr.to_s)
Axlsx.send(validator, value) unless validator == nil
@signature += 2**idx
self.instance_variable_set :"@#{attr.to_s}", value
@is_text_run = true
end
Expand Down
3 changes: 2 additions & 1 deletion test/profile.rb
Expand Up @@ -15,11 +15,12 @@
row = []
input = (32..126).to_a.pack('U*').chars.to_a
20.times { row << input.shuffle.join}
times = 1000
times = 3000

PerfTools::CpuProfiler.start("/tmp/axlsx_noautowidth") do
p = Axlsx::Package.new
p.use_autowidth = false
p.use_shared_strings = true
wb = p.workbook

#A Simple Workbook
Expand Down

0 comments on commit 78e2f07

Please sign in to comment.