ruby-core@ruby-lang.org archive (unofficial mirror)
 help / color / mirror / Atom feed
* [ruby-core:82786] [Ruby trunk Bug#13896] Find.find -> Use Dir.children instead of Dir.entries
       [not found] <redmine.issue-13896.20170914063228@ruby-lang.org>
@ 2017-09-14  6:32 ` esparta
  0 siblings, 0 replies; only message in thread
From: esparta @ 2017-09-14  6:32 UTC (permalink / raw
  To: ruby-core

Issue #13896 has been reported by esparta (Espartaco Palma).

----------------------------------------
Bug #13896: Find.find -> Use Dir.children instead of Dir.entries
https://bugs.ruby-lang.org/issues/13896

* Author: esparta (Espartaco Palma)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: 
* Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN
----------------------------------------
Dir.children is available since Feature #11302. Find.find can
use of the new list (having no '.' neither '..' entries), making
now superflous an if statement.

This change can improve the performance of Find.find when the path
has lots of entries (thousands?).

Some profiling I did using 50,000 files on a given folder, using this code:

~~~
total_size = 0

Find.find(ENV["HOME"]) do |path|
  if FileTest.directory?(path)
   if File.basename(path)[0] == ?.
     Find.prune       # Don't look any further into this directory.
   else
     next
   end
     else
       total_size += FileTest.size(path)
     end
   end
end

~~~
Before the patch

~~~
 ~/ruby -rprofile before.rb
  %   cumulative   self              self     total
 time   seconds   seconds    calls  ms/call  ms/call  name
 48.37     9.24      9.24   100014     0.09     0.60  Find.find
 13.52    11.82      2.58    50005     0.05     0.07  nil#
  5.17    12.81      0.99    50005     0.02     0.35  Kernel#catch
  5.05    13.77      0.96    50006     0.02     0.04  Kernel#dup
  4.96    14.72      0.95    50006     0.02     0.02  Kernel#initialize_dup
  3.87    15.46      0.74        1   738.89  5952.54  Array#reverse_each
  2.39    15.92      0.46   100012     0.00     0.00  String#==
  1.98    16.29      0.38    50004     0.01     0.01  File.join
  1.93    16.66      0.37    50004     0.01     0.01  FileTest.size
  1.87    17.02      0.36    50005     0.01     0.01  File.lstat
  1.76    17.36      0.34    50005     0.01     0.01  FileTest.directory?
  1.34    17.61      0.26    50004     0.01     0.01  Integer#+
  1.30    17.86      0.25    50005     0.00     0.00  File::Stat#directory?
  1.29    18.11      0.25    50006     0.00     0.00  String#initialize_copy
  1.29    18.35      0.25    50004     0.00     0.00  Array#unshift
  1.28    18.60      0.24    50006     0.00     0.00  Array#shift
  1.25    18.84      0.24    50004     0.00     0.00  Kernel#untaint
  1.25    19.08      0.24    50005     0.00     0.00  Kernel#taint
  0.10    19.09      0.02        1    19.53    19.55  Dir.entries
  0.02    19.10      0.00        1     4.10     4.10  Array#sort!
  0.00    19.10      0.00        2     0.47     1.12  Kernel#require
  0.00    19.10      0.00        4     0.02     0.04  Gem.find_unresolved_default_spec
  0.00    19.10      0.00        2     0.04  9549.52  Array#each
  0.00    19.10      0.00        1     0.05     0.07  MonitorMixin#mon_enter
  0.00    19.10      0.00        1     0.04     0.07  MonitorMixin#mon_exit
  0.00    19.10      0.00        1     0.04     0.05  Module#module_function
  0.00    19.10      0.00        4     0.01     0.01  IO#set_encoding
  0.00    19.10      0.00        1     0.02     0.02  Dir.open
  0.00    19.10      0.00        1     0.02     0.11  Array#collect!
  0.00    19.10      0.00        1     0.02     0.02  MonitorMixin#mon_check_owner
  0.00    19.10      0.00        2     0.01     0.01  Module#method_added
  0.00    19.10      0.00        3     0.00     0.00  Thread.current
  0.00    19.10      0.00        2     0.01     0.01  String#encoding
  0.00    19.10      0.00        2     0.01     0.01  BasicObject#singleton_method_added
  0.00    19.10      0.00        2     0.00     0.00  Kernel#respond_to?
  0.00    19.10      0.00        1     0.01     0.01  TracePoint#enable
  0.00    19.10      0.00        1     0.01     0.01  Gem::Specification.unresolved_deps
  0.00    19.10      0.00        1     0.01     0.01  File.exist?
  0.00    19.10      0.00        1     0.01     0.01  File.basename
  0.00    19.10      0.00        1     0.01     0.01  Thread::Mutex#lock
  0.00    19.10      0.00        1     0.01     0.01  String#[]
  0.00    19.10      0.00        1     0.01     0.01  Gem.suffixes
  0.00    19.10      0.00        1     0.01     0.01  Thread::Mutex#unlock
  0.00    19.10      0.00        1     0.01     0.01  Encoding.find
  0.00    19.10      0.00        1     0.01     0.01  BasicObject#==
  0.00    19.10      0.00        1     0.00     0.00  TracePoint#disable
  0.00    19.10      0.00        1     0.00     0.00  Kernel#block_given?
  0.00    19.10      0.00        1     0.00 19100.95  #toplevel
~~~

After the patch

~~~
  %   cumulative   self              self     total
 time   seconds   seconds    calls  ms/call  ms/call  name
 45.15     7.70      7.70   100012     0.08     0.52  Find.find
 15.12    10.27      2.58    50005     0.05     0.07  nil#
  5.76    11.25      0.98    50005     0.02     0.31  Kernel#catch
  5.66    12.22      0.96    50006     0.02     0.04  Kernel#dup
  5.59    13.17      0.95    50006     0.02     0.02  Kernel#initialize_dup
  4.30    13.91      0.73        1   733.77  3952.79  Array#reverse_each
  2.12    14.27      0.36    50005     0.01     0.01  File.lstat
  2.08    14.62      0.35    50004     0.01     0.01  FileTest.size
  2.06    14.97      0.35    50004     0.01     0.01  File.join
  1.93    15.30      0.33    50005     0.01     0.01  FileTest.directory?
  1.47    15.55      0.25    50005     0.00     0.00  File::Stat#directory?
  1.46    15.80      0.25    50006     0.00     0.00  String#initialize_copy
  1.46    16.05      0.25    50004     0.00     0.00  Integer#+
  1.44    16.30      0.25    50004     0.00     0.00  Array#unshift
  1.44    16.54      0.24    50006     0.00     0.00  Array#shift
  1.41    16.78      0.24    50004     0.00     0.00  Kernel#untaint
  1.40    17.02      0.24    50005     0.00     0.00  Kernel#taint
  0.11    17.04      0.02        1    19.16    19.18  Dir.children
  0.02    17.04      0.00        1     4.14     4.14  Array#sort!
  0.00    17.04      0.00        1     0.61     0.69  Kernel#require_relative
  0.00    17.04      0.00        1     0.04     0.05  Module#module_function
  0.00    17.04      0.00        4     0.01     0.01  IO#set_encoding
  0.00    17.04      0.00        1     0.02 17043.77  Array#each
  0.00    17.04      0.00        1     0.02     0.11  Array#collect!
  0.00    17.04      0.00        1     0.02     0.02  Dir.open
  0.00    17.04      0.00        2     0.01     0.01  Module#method_added
  0.00    17.04      0.00        1     0.01     0.01  TracePoint#enable
  0.00    17.04      0.00        2     0.00     0.00  String#encoding
  0.00    17.04      0.00        2     0.00     0.00  BasicObject#singleton_method_added
  0.00    17.04      0.00        1     0.01     0.01  File.basename
  0.00    17.04      0.00        1     0.01     0.01  File.exist?
  0.00    17.04      0.00        1     0.01     0.01  String#[]
  0.00    17.04      0.00        1     0.01     0.01  Encoding.find
  0.00    17.04      0.00        1     0.01     0.01  String#==
  0.00    17.04      0.00        1     0.01     0.01  BasicObject#==
  0.00    17.04      0.00        1     0.00     0.00  TracePoint#disable
  0.00    17.04      0.00        1     0.00     0.00  Kernel#block_given?
  0.00    17.04      0.00        1     0.00     0.00  Kernel#respond_to?
  0.00    17.05      0.00        1     0.00 17045.11  #toplevel
~~~

https://github.com/ruby/ruby/pull/1697



-- 
https://bugs.ruby-lang.org/

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2017-09-14  6:32 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <redmine.issue-13896.20170914063228@ruby-lang.org>
2017-09-14  6:32 ` [ruby-core:82786] [Ruby trunk Bug#13896] Find.find -> Use Dir.children instead of Dir.entries esparta

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).