ruby-mdbx/experiments/thread_usage.rb
mahlon@martini.nu c0cd35e260 Multiple changes.
- Complete first round of documentation.
  - Complete first round of tests and coverage.
  - Expand the thread benchmarker for testing metasync.
  - Add enumerators (each_key/each_value/each_pair) using cursors.
  - Remove keys() implementation in favor of using the emumerable.
  - Make deserialization more DRY.
  - Add an efficient length() method.
  - Add various Hash-alike methods.
  - General code cleanup for release.

FossilOrigin-Name: 0d2bd3995f203c9ac1734ac3da32dd2f09efda9a394e554e6006e44dd07a33b0
2021-03-14 23:19:41 +00:00

81 lines
1.4 KiB
Ruby
Executable file

#!/usr/bin/env ruby
#
require 'mdbx'
require 'benchmark'
require 'fileutils'
include FileUtils
at_exit do
rm_r 'tmpdb'
end
THREAD_COUNT = 10
WRITES_PER = 1000
puts "#{THREAD_COUNT} simultaneous threads, #{WRITES_PER} writes each:"
def run_bench( db, msg )
mtx = Mutex.new
Benchmark.bm( 10 ) do |x|
puts msg
puts '-' * 60
x.report( " txn per write:" ) do
threads = []
THREAD_COUNT.times do |i|
threads << Thread.new do
mtx.synchronize do
WRITES_PER.times do
key = "%02d-%d" % [ i, rand(1000) ]
db[ key ] = rand(1000)
end
end
end
end
threads.map( &:join )
end
# Long running transactions require a mutex across threads.
#
x.report( "txn per thread:" ) do
threads = []
THREAD_COUNT.times do |i|
threads << Thread.new do
mtx.synchronize do
db.transaction do
WRITES_PER.times do
key = "%02d-%d" % [ i, rand(1000) ]
db[ key ] = rand(1000)
end
end
end
end
end
threads.map( &:join )
end
x.report( " unthreaded:" ) do
db.transaction do
( THREAD_COUNT * WRITES_PER ).times do
key = "000-%d" % [ rand(1000) ]
db[ key ] = rand(1000)
end
end
end
end
db.close
puts
end
db = MDBX::Database.open( 'tmpdb' )
run_bench( db, "Default database flags:" )
db = MDBX::Database.open( 'tmpdb', no_metasync: true )
run_bench( db, "Disabled metasync:" )