Skip to content

Commit

Permalink
Add benchmark
Browse files Browse the repository at this point in the history
  • Loading branch information
Watson1978 committed Nov 7, 2023
1 parent 5712f6f commit 1490d9f
Show file tree
Hide file tree
Showing 3 changed files with 298 additions and 1 deletion.
155 changes: 155 additions & 0 deletions example/benchmark_insert.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
require 'bundler/inline'
gemfile do
source 'https://rubygems.org'
gem 'benchmark-ips'
gem 'sorted_set'
gem 'cassandra-driver', require: 'cassandra'
gem 'ilios'
end


Ilios::Cassandra.config = {
keyspace: 'ilios',
hosts: ['127.0.0.1'],
}

# Create new table
statement = Ilios::Cassandra.session.prepare(<<~CQL)
DROP TABLE IF EXISTS ilios.benchmark_insert
CQL
Ilios::Cassandra.session.execute(statement)

statement = Ilios::Cassandra.session.prepare(<<~CQL)
CREATE TABLE IF NOT EXISTS ilios.benchmark_insert (
id bigint,
message text,
created_at timestamp,
PRIMARY KEY (id)
) WITH compaction = { 'class' : 'LeveledCompactionStrategy' }
AND gc_grace_seconds = 691200;
CQL
Ilios::Cassandra.session.execute(statement)


class BenchmarkCassandra
def initialize
@cluster = Cassandra.cluster
@keyspace = 'ilios'
@session = @cluster.connect(@keyspace)
end

def run_execute(x)
x.report('cassandra-driver:execute') do
@session.execute(statement, {
arguments: {
id: Random.rand(2**40),
message: 'hello',
created_at: Time.now
}
})
end
end

def run_execute_async(x)
x.report('cassandra-driver:execute_async') do
future = @session.execute_async(statement, {
arguments: {
id: Random.rand(2**40),
message: 'hello',
created_at: Time.now
}
})
future.on_success do |rows|
end
end
end

def statement
@statement ||= @session.prepare(<<~CQL)
INSERT INTO ilios.benchmark_insert (
id,
message,
created_at
) VALUES (?, ?, ?)
CQL
end
end

class BenchmarkIlios
def run_execute(x)
x.report('ilios:execute') do
statement.bind({
id: Random.rand(2**40),
message: 'hello',
created_at: Time.now
})
Ilios::Cassandra.session.execute(statement)
end
end

def run_execute_async(x)
x.report('ilios:execute_async') do
statement.bind({
id: Random.rand(2**40),
message: 'hello',
created_at: Time.now
})
future = Ilios::Cassandra.session.execute_async(statement)
future.on_success do |results|
results.each do |row|
end
end
end
end

def statement
@statement ||= Ilios::Cassandra.session.prepare(<<-CQL)
INSERT INTO ilios.benchmark_insert (
id,
message,
created_at
) VALUES (?, ?, ?)
CQL
end
end

Benchmark.ips do |x|
BenchmarkCassandra.new.run_execute(x)
BenchmarkCassandra.new.run_execute_async(x)
end

sleep 3

puts ""
Benchmark.ips do |x|
BenchmarkIlios.new.run_execute(x)
BenchmarkIlios.new.run_execute_async(x)
end

=begin
## Environment
- OS: Manjaro Linux x86_64
- CPU: AMD Ryzen 9 7940HS
- Compiler: gcc 13.2.1
- Ruby: ruby 3.2.2
## Results
[ips]
Warming up --------------------------------------
cassandra-driver:execute
466.000 i/100ms
cassandra-driver:execute_async
3.586k i/100ms
Calculating -------------------------------------
cassandra-driver:execute
3.528k (±32.1%) i/s - 11.184k in 5.086228s
cassandra-driver:execute_async
38.195k (±25.5%) i/s - 172.128k in 5.070384s
Warming up --------------------------------------
ilios:execute 233.000 i/100ms
ilios:execute_async 344.000 i/100ms
Calculating -------------------------------------
ilios:execute 4.631k (± 2.4%) i/s - 23.300k in 5.034599s
ilios:execute_async 170.712k (±23.2%) i/s - 800.832k in 4.993818s
=end
142 changes: 142 additions & 0 deletions example/benchmark_select.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
require 'bundler/inline'
gemfile do
source 'https://rubygems.org'
gem 'benchmark-ips'
gem 'sorted_set'
gem 'cassandra-driver', require: 'cassandra'
gem 'ilios'
end


Ilios::Cassandra.config = {
keyspace: 'ilios',
hosts: ['127.0.0.1'],
}

# Create new table
statement = Ilios::Cassandra.session.prepare(<<~CQL)
DROP TABLE IF EXISTS ilios.benchmark_select
CQL
Ilios::Cassandra.session.execute(statement)

statement = Ilios::Cassandra.session.prepare(<<~CQL)
CREATE TABLE IF NOT EXISTS ilios.benchmark_select (
id bigint,
message text,
created_at timestamp,
PRIMARY KEY (id)
) WITH compaction = { 'class' : 'LeveledCompactionStrategy' }
AND gc_grace_seconds = 691200;
CQL
Ilios::Cassandra.session.execute(statement)

# Prepare data
statement = Ilios::Cassandra.session.prepare(<<-CQL)
INSERT INTO ilios.benchmark_select (
id,
message,
created_at
) VALUES (?, ?, ?)
CQL

1000.times do
statement.bind({
id: Random.rand(2**40),
message: 'hello',
created_at: Time.now
})
Ilios::Cassandra.session.execute(statement)
end


class BenchmarkCassandra
def initialize
@cluster = Cassandra.cluster
@keyspace = 'ilios'
@session = @cluster.connect(@keyspace)
end

def run_execute(x)
x.report('cassandra-driver:execute') do
@session.execute(statement)
end
end

def run_execute_async(x)
x.report('cassandra-driver:execute_async') do
future = @session.execute_async(statement)
future.on_success do |rows|
end
end
end

def statement
@statement ||= @session.prepare(<<~CQL)
SELECT * FROM ilios.benchmark_select
CQL
end
end

class BenchmarkIlios
def run_execute(x)
x.report('ilios:execute') do
Ilios::Cassandra.session.execute(statement)
end
end

def run_execute_async(x)
x.report('ilios:execute_async') do
future = Ilios::Cassandra.session.execute_async(statement)
future.on_success do |results|
results.each do |row|
end
end
end
end

def statement
@statement ||= Ilios::Cassandra.session.prepare(<<-CQL)
SELECT * FROM ilios.benchmark_select
CQL
end
end

Benchmark.ips do |x|
BenchmarkCassandra.new.run_execute(x)
BenchmarkCassandra.new.run_execute_async(x)
end

sleep 3

puts ""
Benchmark.ips do |x|
BenchmarkIlios.new.run_execute(x)
BenchmarkIlios.new.run_execute_async(x)
end

=begin
## Environment
- OS: Manjaro Linux x86_64
- CPU: AMD Ryzen 9 7940HS
- Compiler: gcc 13.2.1
- Ruby: ruby 3.2.2
## Results
Warming up --------------------------------------
cassandra-driver:execute
12.000 i/100ms
cassandra-driver:execute_async
4.808k i/100ms
Calculating -------------------------------------
cassandra-driver:execute
49.270 (±18.3%) i/s - 240.000 in 5.055331s
cassandra-driver:execute_async
81.981k (±26.7%) i/s - 326.944k in 5.114737s
Warming up --------------------------------------
ilios:execute 15.000 i/100ms
ilios:execute_async 4.000 i/100ms
Calculating -------------------------------------
ilios:execute 156.303 (±35.2%) i/s - 615.000 in 5.033882s
ilios:execute_async 428.707k (±35.4%) i/s - 16.716k in 4.949610s
=end
2 changes: 1 addition & 1 deletion ilios.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Gem::Specification.new do |spec|
spec.files =
Dir.chdir(__dir__) do
`git ls-files -z`.split("\x0").reject do |f|
(f == __FILE__) || f.match(%r{\A(?:(?:test)/|\.(?:git|editorconfig|rubocop.*))})
(f == __FILE__) || f.match(%r{\A(?:(?:test|example)/|\.(?:git|editorconfig|rubocop.*))})
end
end
spec.require_paths = ['lib']
Expand Down

0 comments on commit 1490d9f

Please sign in to comment.