PERF: Reduce allocations in Emoji.unicode_replacements.

```
MemoryProfiler.report { Emoji.unicode_replacements }.pretty_print
```

Before:

```
Total allocated: 2032131 bytes (30219 objects)
Total retained:  798059 bytes (10734 objects)

allocated memory by gem
-----------------------------------
   1270762  discourse/app
    690149  2.4.1/lib
     48764  activesupport-4.2.8
     11405  bootsnap-1.0.0
      5266  logster-1.2.7
      2473  hiredis-0.6.1
      2056  redis-3.3.3
       840  discourse/lib
       240  activerecord-4.2.8
       176  thread_safe-0.3.6
```

After:

```
Total allocated: 1715713 bytes (22449 objects)
Total retained:  797985 bytes (10737 objects)

allocated memory by gem
-----------------------------------
    957250  discourse/app
    690028  2.4.1/lib
     48764  activesupport-4.2.8
     11445  bootsnap-1.0.0
      2745  hiredis-0.6.1
      2624  redis-3.3.3
      1473  logster-1.2.7
       928  discourse/lib
       280  activerecord-4.2.8
       176  thread_safe-0.3.6
```
This commit is contained in:
Guo Xiang Tan 2017-06-20 13:18:24 +09:00
parent 40ef5c4f14
commit fa35137d3a

@ -108,10 +108,9 @@ class Emoji
end
def self.replacement_code(code)
hexes = code.split('-').map(&:hex)
hexes = code.split('-'.freeze).map!(&:hex)
# Don't replace digits, letters and some symbols
return hexes.pack("U" * hexes.size) if hexes[0] > 255
hexes.pack("U*".freeze) if hexes[0] > 255
end
def self.unicode_replacements
@ -119,18 +118,20 @@ class Emoji
@unicode_replacements = {}
is_tonable_emojis = Emoji.tonable_emojis
fitzpatrick_scales = FITZPATRICK_SCALE.map { |scale| scale.to_i(16) }
db['emojis'].each do |e|
next if e['name'] == 'tm'
name = e['name']
next if name == 'tm'.freeze
code = replacement_code(e['code'])
next unless code
@unicode_replacements[code] = e['name']
if is_tonable_emojis.include?(e['name'])
FITZPATRICK_SCALE.each_with_index do |scale, index|
toned_code = (code.codepoints.insert(1, scale.to_i(16))).pack("U*")
@unicode_replacements[toned_code] = "#{e['name']}:t#{index+2}"
@unicode_replacements[code] = name
if is_tonable_emojis.include?(name)
fitzpatrick_scales.each_with_index do |scale, index|
toned_code = code.codepoints.insert(1, scale).pack("U*".freeze)
@unicode_replacements[toned_code] = "#{name}:t#{index+2}"
end
end
end