Project

General

Profile

Bug #13228

Updated by nobu (Nobuyoshi Nakada) about 7 years ago

`s[i]=c`(assigning s[i]=c(assigning a character) for `String` String is slower than for `Array` Array on Linux. 

 If I split the `String` String to `Array`, Array, and assign characters, and join the `Array` Array to `String`, 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 

Back