From f3a5a3c449cf004aee662966e6c8dd2ebe122c0f Mon Sep 17 00:00:00 2001 From: apainintheneck Date: Sun, 25 Aug 2024 15:10:02 -0700 Subject: [PATCH] Speed up the Tap#formula_files and Tap#cask_files methods MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These are slow because of some Pathname related reasons so it's been changed up to use `Dir.glob` instead and that makes a large difference. ``` $ hyperfine --parameter-list branch master,speed-up-loading-cask-and-formula-file-names,speed-up-loading-cask-and-formula-file-names_v2 --warmup 5 --setup 'git switch {branch}' 'brew cat gimp' Benchmark 1: brew cat gimp (branch = master) Time (mean ± σ): 2.150 s ± 0.014 s [User: 1.369 s, System: 0.745 s] Range (min … max): 2.126 s … 2.174 s 10 runs Benchmark 2: brew cat gimp (branch = speed-up-loading-cask-and-formula-file-names) Time (mean ± σ): 1.814 s ± 0.012 s [User: 1.068 s, System: 0.711 s] Range (min … max): 1.797 s … 1.840 s 10 runs Benchmark 3: brew cat gimp (branch = speed-up-loading-cask-and-formula-file-names_v2) Time (mean ± σ): 1.489 s ± 0.009 s [User: 0.905 s, System: 0.550 s] Range (min … max): 1.478 s … 1.503 s 10 runs Summary brew cat gimp (branch = speed-up-loading-cask-and-formula-file-names_v2) ran 1.22 ± 0.01 times faster than brew cat gimp (branch = speed-up-loading-cask-and-formula-file-names) 1.44 ± 0.01 times faster than brew cat gimp (branch = master) ``` --- Library/Homebrew/tap.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Library/Homebrew/tap.rb b/Library/Homebrew/tap.rb index b4e7ab8211..0fa277417d 100644 --- a/Library/Homebrew/tap.rb +++ b/Library/Homebrew/tap.rb @@ -712,10 +712,10 @@ class Tap if formula_dir == path # We only want the top level here so we don't treat commands & casks as formulae. # Sharding is only supported in Formula/ and HomebrewFormula/. - formula_dir.children + Dir.glob(File.join(formula_dir.to_s, "*.rb")) else - formula_dir.find - end.select { formula_file?(_1) } + Dir.glob(File.join(formula_dir.to_s, "**/*.rb")) + end.map { Pathname(_1) } else [] end @@ -736,7 +736,7 @@ class Tap sig { returns(T::Array[Pathname]) } def cask_files @cask_files ||= if cask_dir.directory? - cask_dir.find.select { ruby_file?(_1) } + Dir.glob(File.join(cask_dir.to_s, "**/*.rb")).map { Pathname(_1) } else [] end