[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/

In This Thread

Prev Next