Slide 1

Slide 1 text

Sameer Deshmukh github.com/v0dro @v0dro

Slide 2

Slide 2 text

Ruby Science Foundation www.sciruby.com @sciruby @sciruby

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

benchmark­plot

Slide 5

Slide 5 text

There are three kinds of lies: Lies, damned lies, and benchmarks.

Slide 6

Slide 6 text

Compare the same code before and after refactor. Compare performance of two distinct ways of doing the same thing. Curiosity.

Slide 7

Slide 7 text

Array#map -> Array#flatten a.map { |e| [e,e] }.flatten # => [1,1,2,3,3.... Array#flat_map a.flat_map { |e| [e,e] } # => [1,1,2,2,3,3.... a = (1..size).to_a

Slide 8

Slide 8 text

require 'benchmark' Benchmark.bm do |x| x.report("map.flat") do (1..1000).to_a.map { |e| [e,e] }.flatten end x.report("flat_map") do (1..1000).to_a.flat_map { |e| [e,e] } end end

Slide 9

Slide 9 text

user system total real map.flat 0.000 0.000 0.000 ( 0.001025) flat_map 0.000 0.000 0.000 ( 0.000569)

Slide 10

Slide 10 text

require 'benchmark' Benchmark.bm do |x| [100, 500, 1000, 5000].each do |size| x.report("map.flat") do (1..size).to_a.map { |e| [e,e] }.flatten end x.report("flat_map") do (1..size).to_a.flat_map { |e| [e,e] } end end end

Slide 11

Slide 11 text

user system total real map.flat 0.000 0.000 0.000 ( 0.000069) flat_map 0.000 0.000 0.000 ( 0.000062) map.flat 0.000 0.000 0.000 ( 0.000314) flat_map 0.000 0.000 0.000 ( 0.000259) map.flat 0.000 0.000 0.000 ( 0.000750) flat_map 0.000 0.000 0.000 ( 0.000409) map.flat 0.000 0.000 0.000 ( 0.003270) flat_map 0.010 0.000 0.010 ( 0.001771)

Slide 12

Slide 12 text

benchmark­plot to the rescue!

Slide 13

Slide 13 text

Benchmark.plot()

Slide 14

Slide 14 text

require 'benchmark/plot' arr = [100, 500, 1000, 5000] Benchmark.plot(arr) do |x| x.report("map.flat") do |size| (1..size).to_a.map { |e| [e,e] }.flatten end x.report("flat_map") do |size| (1..size).to_a.flat_map { |e| [e,e] } end end

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

require 'benchmark/plot' arr = [100, 500, 1000, 5000] arr.map! { |size| (1..size).to_a } Benchmark.plot(arr) do |x| x.report("map.flat") do |a| a.map { |e| [e,e] }.flatten end x.report("flat_map") do |a| a.flat_map { |e| [e,e] } end end

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

require 'benchmark/plot' arr = [100, 500, 1000, 5000] arr.map! { |size| (1..size).to_a } Benchmark.plot(arr) do |x| x.report("map.flat") do |a| a.map { |e| [e,e] }.flatten end x.report("flat_map") do |a| a.flat_map { |e| [e,e] } end end

Slide 19

Slide 19 text

class TestArray attr_reader :data def initialize data @data = data end def to_s @data.size.to_s end end

Slide 20

Slide 20 text

require 'benchmark/plot' arr = [100, 500, 1000, 5000] arr.map! { |size| TestArray.new (1..size).to_a } Benchmark.plot(arr) do |x| x.report("map.flat") do |a| a.data.map { |e| [e,e] }.flatten end x.report("flat_map") do |a| a.data.flat_map { |e| [e,e] } end end

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

Customization Options ● :title – Change the title of the graph. ● :x_labels – Toggle whether X axis labels should be displayed. ● :x_axis_label – A string for the label of the X axis. ● :time – The kind of time that you want plotted (real time or system CPU time or user CPU time). ● :file_name – The file name of the graph.

Slide 23

Slide 23 text

Thank You PRUG!

Slide 24

Slide 24 text

Any questions?