From: naruse@... Date: 2017-04-17T09:39:12+00:00 Subject: [ruby-dev:50085] [Ruby trunk Bug#13228][Rejected] s[i]=c(assigning a character) for String is slower than Array on Linux Issue #13228 has been updated by naruse (Yui NARUSE). Status changed from Open to Rejected It's natural because String index access requires character counting. If you need performance and the string is ASCII or Binary, you can set encoding of the string by String#force_encoding. Then ruby can use direct index access. Maybe your Mac's locale is LANG=C and strings are handled as single byte encoding. You can confirm this by `Encoding.locale_charmap`. ---------------------------------------- Bug #13228: s[i]=c(assigning a character) for String is slower than Array on Linux https://bugs.ruby-lang.org/issues/13228#change-64293 * Author: yoshiokatsuneo (Tsuneo Yoshioka) * Status: Rejected * Priority: Normal * Assignee: * Target version: * ruby -v: ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-linux] * Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN ---------------------------------------- s[i]=c(assigning a character) for String is slower than for Array on Linux. If I split the String to Array, and assign characters, and join the Array to String, then it is much faster than assigning characters directly to the string. Somehow, I don't see the performance difference on Mac OS X. ~$ time ruby -e 'N=100000; s="a"*N; N.times{s[Random.rand(N)]="Z"}; puts s' >/dev/null real 0m0.879s user 0m0.836s sys 0m0.012s ~$ time ruby -e 'N=100000;s="a"*N;s=s.split(""); N.times{s[Random.rand(N)]="Z"}; puts s.join("")' >/dev/null real 0m0.153s user 0m0.108s sys 0m0.016s ~$ uname -a Linux aaaaaaaa 4.4.0-43-generic #63-Ubuntu SMP Wed Oct 12 13:48:03 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux ~$ ruby --version ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-linux] ~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 16.04.1 LTS Release: 16.04 Codename: xenial -- https://bugs.ruby-lang.org/