From: alanwucanada@... Date: 2019-02-17T03:32:13+00:00 Subject: [ruby-core:91578] [Ruby trunk Feature#15331] [PATCH] Faster hashing for short string literals Issue #15331 has been updated by alanwu (Alan Wu). After running some benchmarks on rubygems.org with wrk, I do not think this is patch is a good idea anymore. It seems to decrease throughput instead of increase it, despite the theoretical improvement shown in micro benchmarks. The 1% improvement is there, but it's due to a change I made to ActiveRecord to make it benefit from hash memoization, not due to the hash memorization itself. The better place to do this optimization is probably at compile time, after doing inlining, I think. Thank you again for taking a look at this patch. I learned a lot trying to put it together. ---------------------------------------- Feature #15331: [PATCH] Faster hashing for short string literals https://bugs.ruby-lang.org/issues/15331#change-76842 * Author: alanwu (Alan Wu) * Status: Closed * Priority: Normal * Assignee: * Target version: ---------------------------------------- ## Background It's common for applications to use string literals as hash keys, especially for applications that work with YAML or JSON: ``` paylod['name'] ``` At the moment (r65895), hash lookups using a string key is about 30% slower than using a symbol key. ## Proposal We memoize the hash code for short fstrings. There is extra, currently unused space at the end of the RString struct we can use to store the hash code. The unique nature of fstrings makes it so that every user of each fstring benefit from the memoized hash. ## Evaluation The included benchmark hash_aref_fstr.rb is about 20% faster with this optimization. hash_aref_long_str.rb shows that for long strings which we cannot memoize, there is no visible performance penalty. vm2_freezestring.yml is also not visibly slower after this optimization. I have also attached a bechmark (string_key_vs_symbol_key.rb) that compares hash lookups with symbols against hash lookups with strings. With this optimization, the gap in performance is smaller. (10% slower post patch vs 30% slower on trunk) ---Files-------------------------------- string_key_vs_symbol_key.rb (594 Bytes) 0001-Hash-code-memoization-for-short-fstrings.patch (3.62 KB) 0001-Hash-code-memoization-for-short-fstrings-v2.patch (4.29 KB) 0001-Hash-code-memoization-for-short-fstrings-v3.patch (4.36 KB) 0001-Hash-code-memoization-for-short-fstrings-v4.patch (4.31 KB) 0001-Hash-code-memoization-for-short-fstrings-v5.patch (12.9 KB) 0001-Add-st_update_with_hash.patch (3.09 KB) 0002-Hash-code-memoization-for-short-fstrings.patch (10 KB) -- https://bugs.ruby-lang.org/ Unsubscribe: