Optimizing Ruby Path Methods
5 hours ago
- #Bootsnap
- #CI Performance
- #Ruby Optimization
- Bootsnap optimizes Ruby's file loading by caching load paths to avoid repeated expensive searches.
- Load path caching converts O(N*M) boot time complexity into O(1) lookups, speeding up application startup.
- Cache invalidation relies on directory mtime, but git doesn't update mtimes, requiring frequent cache rebuilds on CI.
- Bootsnap's path scanner had an N+1 syscall issue due to stat calls for each directory entry.
- Dir.scan was introduced in Ruby 4.1 to expose file types without extra stat calls, improving scanning speed by 2x.
- File.join was optimized by implementing a fast path for ASCII-compatible encodings and fixing inefficient reverse search.
- Encoding handling, especially for Shift JIS, previously slowed File.join; a fast path now speeds up UTF-8 and ASCII cases.
- Optimizations to File.join made it over 7 times faster for common cases, outperforming simple string interpolation.
- Other path methods like File.basename, File.extname, and File.dirname received similar optimizations for consistency.