Skip to content

Commit 2b6d0d8

Browse files
author
Andrew Delikat
committed
Benchmark interface methods
Test Plan: n/a Reviewers: ali, mike.ng, vignesh, haley.bash Reviewed By: haley.bash JIRA Issues: sst-537 Differential Revision: https://phabricator.optimizely.com/D12082
1 parent ea68213 commit 2b6d0d8

File tree

8 files changed

+3483
-1
lines changed

8 files changed

+3483
-1
lines changed

Rakefile

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
require 'bundler/gem_tasks'
2+
require_relative 'spec/benchmarking/benchmark'
3+
24
begin
35
require 'rspec/core/rake_task'
46
RSpec::Core::RakeTask.new(:spec)
@@ -8,4 +10,8 @@ require 'optimizely/version'
810

911
Bundler::GemHelper.install_tasks
1012

13+
task :benchmark do
14+
OptimizelyBenchmark.run_tests
15+
end
16+
1117
task :default => :spec

lib/optimizely/event_dispatcher.rb

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,22 @@
11
require 'httparty'
22

33
module Optimizely
4-
class EventDispatcher
4+
class BaseEventDispatcher
5+
# Class encapsulating event dispatching functionality.
6+
# Override with your own EventDispatcher providing dispatch_event method.
7+
8+
def dispatch_event(_url, _params)
9+
end
10+
end
11+
12+
class NoOpEventDispatcher < BaseEventDispatcher
13+
# Class providing dispatch_event method which does nothing.
14+
15+
def dispatch_event(_url, _params)
16+
end
17+
end
18+
19+
class EventDispatcher < BaseEventDispatcher
520
REQUEST_TIMEOUT = 10
621

722
def dispatch_event(url, params)

pkg/optimizely-sdk-0.1.1.gem

-18 KB
Binary file not shown.

spec/benchmarking/benchmark.rb

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
require 'optimizely'
2+
require 'benchmark'
3+
require_relative 'data.rb'
4+
5+
module OptimizelyBenchmark
6+
ITERATIONS = 10.freeze
7+
8+
class PerformanceTests
9+
@error_handler = Optimizely::NoOpErrorHandler.new
10+
@logger = Optimizely::NoOpLogger.new
11+
12+
def self.test_initialize(testdata, optly, user_id)
13+
Optimizely::Project.new(testdata)
14+
end
15+
16+
def self.test_initialize_logger(testdata, optly, user_id)
17+
Optimizely::Project.new(testdata, nil, @logger)
18+
end
19+
20+
def self.test_initialize_logger_and_error_handler(testdata, optly, user_id)
21+
Optimizely::Project.new(testdata, nil, @logger, @error_handler)
22+
end
23+
24+
def self.test_initialize_no_schema_validation(testdata, optly, user_id)
25+
Optimizely::Project.new(testdata, nil, nil, nil, true)
26+
end
27+
28+
def self.test_initialize_logger_no_schema_validation(testdata, optly, user_id)
29+
Optimizely::Project.new(testdata, nil, @logger, nil, true)
30+
end
31+
32+
def self.test_initialize_error_handler_no_schema_validation(testdata, optly, user_id)
33+
Optimizely::Project.new(testdata, nil, nil, @error_handler, true)
34+
end
35+
36+
def self.test_initialize_logger_error_handler_no_schema_validation(testdata, optly, user_id)
37+
Optimizely::Project.new(testdata, nil, @logger, @error_handler, true)
38+
end
39+
40+
def self.test_activate(testdata, optly, user_id)
41+
optly.activate('testExperiment2', user_id)
42+
end
43+
44+
def self.test_activate_with_attributes(testdata, optly, user_id)
45+
optly.activate('testExperimentWithFirefoxAudience', user_id, {'browser_type' => 'firefox'})
46+
end
47+
48+
def self.test_activate_with_forced_variation(testdata, optly, user_id)
49+
optly.activate('testExperiment2', user_id)
50+
end
51+
52+
def self.test_activate_grouped_exp(testdata, optly, user_id)
53+
optly.activate('mutex_exp2', user_id)
54+
end
55+
56+
def self.test_activate_grouped_exp_with_attributes(testdata, optly, user_id)
57+
optly.activate('mutex_exp1', user_id, {'browser_type' => 'firefox'})
58+
end
59+
60+
def self.test_get_variation(testdata, optly, user_id)
61+
optly.get_variation('testExperiment2', user_id)
62+
end
63+
64+
def self.test_get_variation_with_attributes(testdata, optly, user_id)
65+
optly.get_variation('testExperimentWithFirefoxAudience', user_id, {'browser_type' => 'firefox'})
66+
end
67+
68+
def self.test_get_variation_with_forced_variation(testdata, optly, user_id)
69+
optly.get_variation('testExperiment2', 'variation_user')
70+
end
71+
72+
def self.test_get_variation_grouped_exp(testdata, optly, user_id)
73+
optly.get_variation('mutex_exp2', user_id)
74+
end
75+
76+
def self.test_get_variation_grouped_exp_with_attributes(testdata, optly, user_id)
77+
optly.get_variation('mutex_exp1', user_id, {'browser_type' => 'firefox'})
78+
end
79+
80+
def self.test_track(testdata, optly, user_id)
81+
optly.track('testEvent', user_id)
82+
end
83+
84+
def self.test_track_with_attributes(testdata, optly, user_id)
85+
optly.track('testEventWithAudiences', user_id, {'browser_type' => 'firefox'})
86+
end
87+
88+
def self.test_track_with_revenue(testdata, optly, user_id)
89+
optly.track('testEvent', user_id, nil, 666)
90+
end
91+
92+
def self.test_track_with_attributes_and_revenue(testdata, optly, user_id)
93+
optly.track('testEventWithAudiences', user_id, {'browser_type' => 'firefox'}, 666)
94+
end
95+
96+
def self.test_track_grouped_exp(testdata, optly, user_id)
97+
optly.track('testEventWithMultipleGroupedExperiments', user_id)
98+
end
99+
100+
def self.test_track_grouped_exp_with_attributes(testdata, optly, user_id)
101+
optly.track('testEventWithMultipleExperiments', user_id, {'browser_type' => 'firefox'})
102+
end
103+
104+
def self.test_track_grouped_exp_with_revenue(testdata, optly, user_id)
105+
optly.track('testEventWithMultipleGroupedExperiments', user_id, nil, 666)
106+
end
107+
108+
def self.test_track_grouped_exp_with_attributes_and_revenue(testdata, optly, user_id)
109+
optly.track('testEventWithMultipleExperiments', user_id, {'browser_type' => 'firefox'}, 666)
110+
end
111+
end
112+
113+
module_function
114+
115+
def run_tests
116+
testdata10 = File.read('spec/benchmarking/testdata_10.json')
117+
testdata25 = File.read('spec/benchmarking/testdata_25.json')
118+
testdata50 = File.read('spec/benchmarking/testdata_50.json')
119+
event_dispatcher = Optimizely::NoOpEventDispatcher.new
120+
optly10 = Optimizely::Project.new(testdata10, event_dispatcher)
121+
optly25 = Optimizely::Project.new(testdata25, event_dispatcher)
122+
optly50 = Optimizely::Project.new(testdata50, event_dispatcher)
123+
124+
tests = PerformanceTests.methods(false)
125+
tests.each do |test|
126+
tms10 = []
127+
tms25 = []
128+
tms50 = []
129+
130+
ITERATIONS.times do
131+
tms10.push(Benchmark.measure { PerformanceTests.send(test, testdata10, optly10, TEST_DATA.fetch(test, {}).fetch(10, '')) })
132+
tms25.push(Benchmark.measure { PerformanceTests.send(test, testdata25, optly25, TEST_DATA.fetch(test, {}).fetch(25, '')) })
133+
tms50.push(Benchmark.measure { PerformanceTests.send(test, testdata50, optly50, TEST_DATA.fetch(test, {}).fetch(50, '')) })
134+
end
135+
136+
trim_max_min(tms10)
137+
trim_max_min(tms25)
138+
trim_max_min(tms50)
139+
140+
puts test, ' ' + Benchmark::CAPTION
141+
puts '10 exp:' + ((tms10.reduce(:+) / tms10.size) * 1000).format(Benchmark::FORMAT)
142+
puts '25 exp:' + ((tms25.reduce(:+) / tms25.size) * 1000).format(Benchmark::FORMAT)
143+
puts '50 exp:' + ((tms50.reduce(:+) / tms50.size) * 1000).format(Benchmark::FORMAT)
144+
puts ''
145+
end
146+
end
147+
148+
def trim_max_min(tms)
149+
tms.delete_at(tms.index(tms.min_by { |tm| tm.real }))
150+
tms.delete_at(tms.index(tms.max_by { |tm| tm.real }))
151+
end
152+
end

spec/benchmarking/data.rb

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
module OptimizelyBenchmark
2+
TEST_DATA = {
3+
'test_activate' => {
4+
10 => 'test',
5+
25 => 'optimizely_user',
6+
50 => 'optimizely_user'
7+
},
8+
'test_activate_with_attributes' => {
9+
10 => 'optimizely_user',
10+
25 => 'optimizely_user',
11+
50 => 'test'
12+
},
13+
'test_activate_with_forced_variation' => {
14+
10 => 'variation_user',
15+
25 => 'variation_user',
16+
50 => 'variation_user'
17+
},
18+
'test_activate_grouped_exp' => {
19+
10 => 'no',
20+
25 => 'test',
21+
50 => 'optimizely_user'
22+
},
23+
'test_activate_grouped_exp_with_attributes' => {
24+
10 => 'test',
25+
25 => 'yes',
26+
50 => 'test'
27+
},
28+
'test_get_variation' => {
29+
10 => 'test',
30+
25 => 'optimizely_user',
31+
50 => 'optimizely_user'
32+
},
33+
'test_get_variation_with_attributes' => {
34+
10 => 'optimizely_user',
35+
25 => 'optimizely_user',
36+
50 => 'test'
37+
},
38+
'test_get_variation_with_forced_variation' => {
39+
10 => 'variation_user',
40+
25 => 'variation_user',
41+
50 => 'variation_user'
42+
},
43+
'test_get_variation_grouped_exp' => {
44+
10 => 'no',
45+
25 => 'test',
46+
50 => 'optimizely_user'
47+
},
48+
'test_get_variation_grouped_exp_with_attributes' => {
49+
10 => 'test',
50+
25 => 'yes',
51+
50 => 'test'
52+
},
53+
'test_track' => {
54+
10 => 'optimizely_user',
55+
25 => 'optimizely_user',
56+
50 => 'optimizely_user'
57+
},
58+
'test_track_with_attributes' => {
59+
10 => 'optimizely_user',
60+
25 => 'optimizely_user',
61+
50 => 'optimizely_user'
62+
},
63+
'test_track_with_revenue' => {
64+
10 => 'optimizely_user',
65+
25 => 'optimizely_user',
66+
50 => 'optimizely_user'
67+
},
68+
'test_track_with_attributes_and_revenue' => {
69+
10 => 'optimizely_user',
70+
25 => 'optimizely_user',
71+
50 => 'optimizely_user'
72+
},
73+
'test_track_grouped_exp' => {
74+
10 => 'no',
75+
25 => 'optimizely_user',
76+
50 => 'optimizely_user'
77+
},
78+
'test_track_grouped_exp_with_attributes' => {
79+
10 => 'optimizely_user',
80+
25 => 'yes',
81+
50 => 'test'
82+
},
83+
'test_track_grouped_exp_with_revenue' => {
84+
10 => 'no',
85+
25 => 'optimizely_user',
86+
50 => 'optimizely_user'
87+
},
88+
'test_track_grouped_exp_with_attributes_and_revenue' => {
89+
10 => 'optimizely_user',
90+
25 => 'yes',
91+
50 => 'test'
92+
},
93+
}
94+
end

0 commit comments

Comments
 (0)