Created
March 7, 2016 17:09
-
-
Save x77686d/be8027586f24428d0cee to your computer and use it in GitHub Desktop.
Demonstrates exponential slowdown with string[n] = "x" as n grows.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
=begin | |
It seems that Ruby 2.2.4, string[n] = "x" is not O(1). It was suggested that | |
this was due to UTF-8 encoding, but I see the same performance with US-ASCII. | |
Any ideas? | |
$ ruby --version | |
ruby 2.2.4p230 (2015-12-16 revision 53155) [x86_64-linux] | |
$ time ruby -E US-ASCII:US-ASCII storeseq2.rb 1000 1000 | |
["Encodings: ", #<Encoding:US-ASCII>, #<Encoding:US-ASCII>] | |
real 0m0.636s | |
user 0m0.584s | |
sys 0m0.016s | |
$ time ruby -E US-ASCII:US-ASCII storeseq2.rb 10_000 100 | |
["Encodings: ", #<Encoding:US-ASCII>, #<Encoding:US-ASCII>] | |
real 0m1.770s | |
user 0m1.712s | |
sys 0m0.052s | |
$ time ruby -E US-ASCII:US-ASCII storeseq2.rb 100_000 10 | |
["Encodings: ", #<Encoding:US-ASCII>, #<Encoding:US-ASCII>] | |
real 0m12.671s | |
user 0m12.649s | |
sys 0m0.012s | |
$ time ruby -E US-ASCII:US-ASCII storeseq2.rb 1_000_000 1 | |
["Encodings: ", #<Encoding:US-ASCII>, #<Encoding:US-ASCII>] | |
real 2m4.756s | |
user 2m3.976s | |
sys 0m0.660s | |
$ rvm 1.9.3 | |
$ ruby --version | |
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux] | |
$ time ruby -E US-ASCII:US-ASCII storeseq2.rb 1_000_000 1 | |
["Encodings: ", #<Encoding:US-ASCII>, #<Encoding:US-ASCII>] | |
real 0m0.493s | |
user 0m0.480s | |
sys 0m0.012s | |
=end | |
if ARGV.size != 2 | |
puts "Usage: STRING-LENGTH REPS" | |
exit | |
end | |
p ["Encodings: ", Encoding.default_external, Encoding.default_internal] | |
s = " " * ARGV[0].to_i | |
ARGV[1].to_i.times do | |
ARGV[0].to_i.times do | |
|i| | |
s[i] = "x" | |
end | |
end | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Update: It looks like this is due to default UTF-8 encoding for string literals.
Adding '# encoding: US-ASCII' produces linear time behavior, without needing -E argument.