[ruby-dev:50085] [Ruby trunk Bug#13228][Rejected] s[i]=c(assigning a character) for String is slower than Array on Linux
From:
naruse@...
Date:
2017-04-17 09:39:12 UTC
List:
ruby-dev #50085
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/