Add block vs ensure benchmark

This commit is contained in:
Loic Nageleisen 2023-04-12 15:34:36 +02:00
commit 484269dba2
Signed by: lloeki
GPG key ID: D05DAEE6889F94C2
4 changed files with 80 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
/vendor/bundle
/.envrc

5
block-ensure/README.md Normal file
View file

@ -0,0 +1,5 @@
```
user system total real
block 0.961390 0.008933 0.970323 ( 0.978850)
ensure 0.752044 0.006407 0.758451 ( 0.763439)
```

29
block-ensure/example.rb Executable file
View file

@ -0,0 +1,29 @@
#!/usr/bin/env ruby
require 'benchmark'
class Example
def initialize
@mutex = Mutex.new
end
def using_block
@mutex.synchronize do
end
end
def using_ensure
@mutex.lock
ensure
@mutex.unlock
end
end
Benchmark.bm(12) do |x|
ex = Example.new
n = 10_000_000
x.report('block') { n.times { ex.using_block } }
x.report('ensure') { n.times { ex.using_ensure } }
end

44
shell.nix Normal file
View file

@ -0,0 +1,44 @@
{
# use the environment channel
pkgs ? import <nixpkgs> {},
# use a pinned package state
pinned ? import(fetchTarball("https://github.com/NixOS/nixpkgs/archive/14d9b465c71.tar.gz")) {},
}:
let
# specify ruby version to use
ruby = pinned.ruby_3_1;
# control llvm/clang version (e.g for packages built from source)
llvm = pinned.llvmPackages_12;
# control gcc version (e.g for packages built from source)
gcc = pinned.gcc12;
in llvm.stdenv.mkDerivation {
# unique project name for this environment derivation
name = "dd-trace-rb.devshell";
buildInputs = [
ruby
# TODO: some gems insist on using `gcc` on Linux, satisfy them for now:
# - json
# - protobuf
# - ruby-prof
gcc
];
shellHook = ''
# get major.minor.0 ruby version
export RUBY_VERSION="$(ruby -e 'puts RUBY_VERSION.gsub(/\d+$/, "0")')"
# make gem install work in-project, compatibly with bundler
export GEM_HOME="$(pwd)/vendor/bundle/ruby/$RUBY_VERSION"
# make bundle work in-project
export BUNDLE_PATH="$(pwd)/vendor/bundle"
# enable calling gem scripts without bundle exec
export PATH="$GEM_HOME/bin:$PATH"
'';
}