[ruby-dev:50084] [Ruby trunk Bug#13228] s[i]=c(assigning a character) for String is slower than Array on Linux

From: her@...
Date: 2017-04-17 09:36:22 UTC
List: ruby-dev #50084
Issue #13228 has been updated by sorah (sorah Shota Fukumori).


Difference of locale configuration, not OS?

~~~
sorah@yuuki ~ $ uname -a
Linux yuuki 4.9.6-gentoo-r1 #1 SMP Sun Feb 12 01:20:31 UTC 2017 x86_64 Intel(R) Celeron(R) CPU N3050 @ 1.60GHz GenuineIntel GNU/Linux

sorah@yuuki ~ $ time env LANG=C  ruby -e 'N=100000; s="a"*N; N.times{s[Random.rand(N)]="Z"}; puts s' >/dev/null

real    0m0.387s
user    0m0.229s
sys     0m0.085s
sorah@yuuki ~ $ time env LANG=en_US.UTF-8  ruby -e 'N=100000; s="a"*N; N.times{s[Random.rand(N)]="Z"}; puts s' >/dev/null

real    0m3.015s
user    0m2.919s
sys     0m0.079s
~~~

----------------------------------------
Bug #13228: s[i]=c(assigning a character) for String is slower than Array on Linux
https://bugs.ruby-lang.org/issues/13228#change-64292

* Author: yoshiokatsuneo (Tsuneo Yoshioka)
* Status: Open
* 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