Isınmış npm install neden yavaş: indirme değil, 1M dosya oluşturma
npm/yarn kurulumlarının neden yavaş kaldığı: darboğaz indirme değil, ~1M dosyanın diske yazılması. clonefile tabanlı çözüm kurulumu 5 kat hızlandırıyor.
Büyük bir JavaScript monorepo'sunda çalışan bir geliştirici, paket önbelleği zaten sıcak olsa bile yeni bir git worktree'de bağımlılık kurulumunun altı dakikadan uzun sürdüğünü fark etti — hiçbir şey indirilmemesine rağmen. Kurulum sürecini üç aşamaya ayırınca (resolve, fetch, materialize) asıl darboğazın paket indirme değil, node_modules ağacının diske yazılması olduğu ortaya çıktı: yaklaşık bir milyon mkdir/open/write/symlink sistem çağrısı. Sıcak önbellek ağ ve disk I/O'sunu ortadan kaldırıyor, ama her dizin girdisinin sıfırdan oluşturulması gerekiyor, bu yüzden dosya sistemi metadata ve journaling yükü baskın hale geliyor.
Bu durum, pnpm veya yarn'ın hardlinks-global modu gibi hardlink tabanlı kurulum stratejilerinin beklenildiği kadar fayda sağlamamasını da açıklıyor: bu stratejiler yazılan byte sayısını azaltıyor ama oluşturulan dosya sistemi girdisi sayısını azaltmıyor. Bir benchmarkta yarn'ın hardlink modu standart kurulumdan daha yavaş çıktı (467s'e karşı 389s).
macOS/APFS üzerinde işe yarayan çözüm, clonefile(2) kullanarak yeniden materialize etme adımını tamamen atlamak oldu; bu sistem çağrısı tüm bir dizin ağacını tek seferde copy-on-write olarak kopyalıyor. Başka bir worktree'de zaten kurulmuş node_modules ağacını klonlayıp, sadece lockfile'lar farklıysa delta kurulumu yaparak kurulum süresi 389 saniyeden ~70-83 saniyeye (yaklaşık 5 kat) düştü, ek disk kullanımı neredeyse sıfır kaldı. Dosya bazlı kopyalama yaklaşımları (cp -cR, cp -R) çok daha kötü performans gösterdi. Yaklaşım, yarn/pnpm/npm ile uyumlu, macOS/APFS için açık kaynak bir araç (wt-deps) olarak paketlendi; lockfile-diff güvenlik kontrolü, eski bir ağacın sessizce kullanılmasını önlüyor.