1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
require 'test_helper'
require 'benchmark'
SONG_PROPERTIES = 1000.times.collect do |i|
"property_#{i}"
end
module SongRepresenter
include Representable::JSON
SONG_PROPERTIES.each { |p| property p }
end
class SongDecorator < Representable::Decorator
include Representable::JSON
SONG_PROPERTIES.each { |p| property p }
end
module AlbumRepresenter
include Representable::JSON
# collection :songs, extend: SongRepresenter
collection :songs, extend: SongDecorator
end
def random_song
attrs = Hash[SONG_PROPERTIES.collect { |n| [n,n] }]
OpenStruct.new(attrs)
end
times = []
3.times.each do
album = OpenStruct.new(songs: 100.times.collect { random_song })
times << Benchmark.measure do
puts "================ next!"
album.extend(AlbumRepresenter).to_json
end
end
puts times.join("")
# 100 songs, 100 attrs
# 0.050000 0.000000 0.050000 ( 0.093157)
## 100 songs, 1000 attrs
# 0.470000 0.010000 0.480000 ( 0.483708)
### without binding cache:
# 2.790000 0.030000 2.820000 ( 2.820190)
### with extend: on Song, with binding cache>
# 2.490000 0.030000 2.520000 ( 2.517433) 2.4-3.0
### without skip?
# 2.030000 0.020000 2.050000 ( 2.050796) 2.1-2.3
### without :writer
# 2.270000 0.010000 2.280000 ( 2.284530 1.9-2.2
### without :render_filter
# 2.020000 0.000000 2.020000 ( 2.030234) 1.5-2.0
###without default_for and skipable?
# 1.730000 0.010000 1.740000 ( 1.735597 1.4-1.7
### without :serialize
# 1.780000 0.010000 1.790000 ( 1.786791) 1.4-1.7
### using decorator
# 1.400000 0.030000 1.430000 ( 1.434206) 1.4-1.6
### with prepare AFTER representable?
# 1.330000 0.010000 1.340000 ( 1.335900) 1.1-1.3
# representable 2.0
# 3.000000 0.020000 3.020000 ( 3.013031) 2.7-3.0
# no method missing
# 2.280000 0.030000 2.310000 ( 2.313522) 2.2-2.5
# no def_delegator in Definition
# 2.130000 0.010000 2.140000 ( 2.136115) 1.7-2.1
|