diff --git a/README.md b/README.md index 3258969..1d01dec 100644 --- a/README.md +++ b/README.md @@ -169,22 +169,28 @@ Custom exception: Kernel#raise: 589148.7 i/s Custom exception: E2MM#Raise: 29004.8 i/s - 20.31x slower ``` -##### `loop` vs `while true` [code](code/general/loop-vs-while-true.rb) +##### `loop` vs `while true` vs `until false` vs `infinite range` [code](code/general/loop-vs-while-true-vs-until-false-vs-infinite-range.rb) ``` -$ ruby -v code/general/loop-vs-while-true.rb -ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux] +$ ruby -v code/general/loop-vs-while-true-vs-until-false-vs-infinite-range.rb +ruby 3.3.0dev (2023-11-12 master 60e19a0b5f) [x86_64-linux] -Calculating ------------------------------------- - While Loop 1.000 i/100ms +Warming up -------------------------------------- + While loop 1.000 i/100ms Kernel loop 1.000 i/100ms -------------------------------------------------- - While Loop 0.536 (± 0.0%) i/s - 3.000 in 5.593042s - Kernel loop 0.223 (± 0.0%) i/s - 2.000 in 8.982355s + Infinite range 1.000 i/100ms + Until loop 1.000 i/100ms +Calculating ------------------------------------- + While loop 0.620 (± 0.0%) i/s - 4.000 in 6.451729s + Kernel loop 0.274 (± 0.0%) i/s - 2.000 in 7.306426s + Infinite range 0.185 (± 0.0%) i/s - 1.000 in 5.420005s + Until loop 0.614 (± 0.0%) i/s - 4.000 in 6.515634s Comparison: - While Loop: 0.5 i/s - Kernel loop: 0.2 i/s - 2.41x slower + While loop: 0.6 i/s + Until loop: 0.6 i/s - 1.01x slower + Kernel loop: 0.3 i/s - 2.26x slower + Infinite range: 0.2 i/s - 3.36x slower ``` ##### `ancestors.include?` vs `<=` [code](code/general/inheritance-check.rb) diff --git a/code/general/loop-vs-while-true-vs-until-false-vs-infinite-range.rb b/code/general/loop-vs-while-true-vs-until-false-vs-infinite-range.rb new file mode 100644 index 0000000..c685e9c --- /dev/null +++ b/code/general/loop-vs-while-true-vs-until-false-vs-infinite-range.rb @@ -0,0 +1,42 @@ +require "benchmark/ips" + +NUMBER = 100_000_000 + +def fastest + index = 0 + while true + break if index > NUMBER + index += 1 + end +end + +def fast + index = 0 + until false + break if index > NUMBER + index += 1 + end +end + +def slow + index = 0 + loop do + break if index > NUMBER + index += 1 + end +end + +def slowest + (0..).each do |index| + break if index > NUMBER + index += 1 + end +end + +Benchmark.ips do |x| + x.report("While loop") { fastest } + x.report("Until loop") { fast } + x.report("Kernel loop") { slow } + x.report("Infinite range") { slowest } + x.compare! +end diff --git a/code/general/loop-vs-while-true.rb b/code/general/loop-vs-while-true.rb deleted file mode 100644 index 33ae139..0000000 --- a/code/general/loop-vs-while-true.rb +++ /dev/null @@ -1,25 +0,0 @@ -require "benchmark/ips" - -NUMBER = 100_000_000 - -def fast - index = 0 - while true - break if index > NUMBER - index += 1 - end -end - -def slow - index = 0 - loop do - break if index > NUMBER - index += 1 - end -end - -Benchmark.ips do |x| - x.report("While Loop") { fast } - x.report("Kernel loop") { slow } - x.compare! -end