From 1e14126b4fa1faab47e5f45c0451a6a500ae74eb Mon Sep 17 00:00:00 2001 From: normal Date: Wed, 4 Oct 2017 00:04:51 +0000 Subject: Dir.empty? releases GVL This converts all slow syscalls in the Dir.empty? implementation to release GVL. We avoid unnecessarily GVL release and reacquire for each slow call (opendir, readdir, closedir) and instead only release and acquire the GVL once in the common case. Benchmark results show a small degradation in single-threaded performance: Execution time (sec) name trunk built dir_empty_p 0.689 0.758 Speedup ratio: compare with the result of `trunk' (greater is better) name built dir_empty_p 0.909 * dir.c (rb_gc_for_fd_with_gvl): new function (nogvl_dir_empty_p): ditto (dir_s_empty_p): use new functions to release GVL * benchmark/bm_dir_empty_p.rb: new benchmark [ruby-core:83071] [Feature #13958] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60111 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- benchmark/bm_dir_empty_p.rb | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 benchmark/bm_dir_empty_p.rb (limited to 'benchmark') diff --git a/benchmark/bm_dir_empty_p.rb b/benchmark/bm_dir_empty_p.rb new file mode 100644 index 0000000000..8329c757cf --- /dev/null +++ b/benchmark/bm_dir_empty_p.rb @@ -0,0 +1,5 @@ +require 'tmpdir' +max = 100_000 +Dir.mktmpdir('bm_dir_empty_p') do |dir| + max.times { Dir.empty?(dir) } +end -- cgit v1.2.3