Debugging rebuild times

I’m wondering if there were any good ways to do a deeper debug on rebuild times. When I run with METEOR_PROFILE I get a lot of time in “files.readFile” probably more than it should need since I am only updating one or two files at a time. My project is relatively big, but I would expect updating a single file should be pretty quick and not 20 seconds.

=> Meteor server restarted at: http://localhost:3000/| (#220) Profiling: ProjectContext prepareProjectForBuild
| 
| ProjectContext prepareProjectForBuild...........................140 ms (1)
| ├─ _initializeCatalog............................................11 ms (1)
| │  ├─ LocalCatalog#initialize....................................10 ms (1)
| │  │  ├─ addPatternsToList                                        7 ms (2)
| │  │  └─ LocalCatalog#_computeEffectiveLocalPackages              1 ms (1)
| │  └─ other _initializeCatalog                                    1 ms
| ├─ _resolveConstraints...........................................35 ms (1)
| │  ├─ Select Package Versions....................................17 ms (1)
| │  │  ├─ new CS.Input                                            16 ms (1)
| │  │  └─ other Select Package Versions                            2 ms
| │  ├─ files.writeFileAtomically                                   1 ms (1)
| │  └─ other _resolveConstraints                                  16 ms
| ├─ _downloadMissingPackages......................................66 ms (1)
| │  ├─ Isopack.readMetadataFromDirectory..........................42 ms (98)
| │  │  ├─ files.stat                                               5 ms (98)
| │  │  ├─ files.readFile                                          29 ms (98)
| │  │  └─ other Isopack.readMetadataFromDirectory                  8 ms
| │  └─ other _downloadMissingPackages                             23 ms
| ├─ _buildLocalPackages...........................................26 ms (1)
| │  ├─ _ensurePackageLoaded(accounts-base)........................14 ms (1)
| │  │  ├─ _ensurePackageLoaded(ecmascript).........................3 ms (1)
| │  │  │  └─ _ensurePackageLoaded(babel-compiler)..................2 ms (1)
| │  │  │     └─ _ensurePackageLoaded(ecmascript-runtime)           1 ms (1)
| │  │  ├─ _ensurePackageLoaded(ddp)................................5 ms (1)
| │  │  │  ├─ _ensurePackageLoaded(ddp-client)                      3 ms (1)
| │  │  │  └─ _ensurePackageLoaded(ddp-server)......................2 ms (1)
| │  │  │     └─ _ensurePackageLoaded(webapp)                       2 ms (1)
| │  │  ├─ _ensurePackageLoaded(mongo)..............................2 ms (1)
| │  │  │  └─ _ensurePackageLoaded(allow-deny)                      1 ms (1)
| │  │  └─ other _ensurePackageLoaded(accounts-base)                1 ms
| │  ├─ _ensurePackageLoaded(accounts-facebook)                     2 ms (1)
| │  └─ other _buildLocalPackages                                   3 ms
| └─ _saveChangedMetadata                                           2 ms (1)
| 
| Top leaves:
| 
| (#220) Total: 140 ms (ProjectContext prepareProjectForBuild)
| 
| (#221) Profiling: Rebuild App
| 
| files.stat                                                        0 ms (1)
| files.readFile                                                    0 ms (1)
| Rebuild App..................................................24,247 ms (1)
| └─ bundler.bundle............................................24,246 ms (1)
|    ├─ initFromAppDir.............................................10 ms (1)
|    │  ├─ optimistic readJsonOrNull................................3 ms (9)
|    │  │  ├─ optimistic readFile...................................2 ms (9)
|    │  │  │  └─ files.readFile                                     2 ms (9)
|    │  │  └─ other optimistic readJsonOrNull                       1 ms
|    │  └─ other initFromAppDir                                     6 ms
|    ├─ compiler.compile(the app)..............................18,936 ms (1)
|    │  ├─ compileUnibuild (the app)...........................18,932 ms (3)
|    │  │  ├─ PackageSource#_findSources for os....................42 ms (1)
|    │  │  │  ├─ _realpath..........................................6 ms (111)
|    │  │  │  │  ├─ files.lstat                                     4 ms (111)
|    │  │  │  │  └─ other _realpath                                 1 ms
|    │  │  │  ├─ files.readdirWithTypes                            13 ms (222)
|    │  │  │  └─ other PackageSource#_findSources for os           23 ms
|    │  │  ├─ optimistic hashOrNull.............................5,025 ms (63842)
|    │  │  │  ├─ optimistic readFile............................3,824 ms (63842)
|    │  │  │  │  ├─ files.readFile                              3,542 ms (63842)
|    │  │  │  │  └─ other optimistic readFile                     283 ms
|    │  │  │  ├─ sha1                                             811 ms (63842)
|    │  │  │  └─ other optimistic hashOrNull                      390 ms
|    │  │  ├─ optimistic readFile...............................9,776 ms (63842)
|    │  │  │  ├─ files.readFile                                 9,585 ms (63842)
|    │  │  │  └─ other optimistic readFile                        191 ms
|    │  │  ├─ PackageSource#_findSources for web.browser...........34 ms (1)
|    │  │  │  ├─ _realpath..........................................6 ms (206)
|    │  │  │  │  ├─ files.lstat                                     4 ms (206)
|    │  │  │  │  └─ other _realpath                                 2 ms
|    │  │  │  ├─ files.readdirWithTypes                            10 ms (412)
|    │  │  │  └─ other PackageSource#_findSources for web.browser  18 ms
|    │  │  ├─ PackageSource#_findSources for web.browser.legacy....27 ms (1)
|    │  │  │  ├─ _realpath                                          2 ms (206)
|    │  │  │  ├─ files.readdirWithTypes                             1 ms (412)
|    │  │  │  └─ other PackageSource#_findSources for web.browser.legacy 24 ms
|    │  │  └─ other compileUnibuild (the app)                   4,026 ms
|    │  └─ other compiler.compile(the app)                          4 ms
|    ├─ compiler.lint(the app).....................................19 ms (1)
|    │  ├─ Isopack#getUnibuildAtArch                               14 ms (177)
|    │  └─ other compiler.lint(the app)                             5 ms
|    ├─ Isopack#getUnibuildAtArch                                  13 ms (177)
|    ├─ bundler.bundle..makeClientTarget........................4,947 ms (1)
|    │  └─ Target#make..........................................4,947 ms (1)
|    │     ├─ Isopack#getUnibuildAtArch                            60 ms (1127)
|    │     ├─ Target#_runCompilerPlugins..........................120 ms (1)
|    │     │  ├─ Isopack#getUnibuildAtArch                          4 ms (2033)
|    │     │  ├─ plugin ecmascript                                  5 ms (1)
|    │     │  ├─ plugin meteor                                      1 ms (1)
|    │     │  ├─ plugin typescript                                 32 ms (1)
|    │     │  ├─ plugin static-html................................49 ms (1)
|    │     │  │  ├─ files.readFile                                 16 ms (222)
|    │     │  │  └─ other plugin static-html                       33 ms
|    │     │  ├─ plugin fourseven:scss                              3 ms (1)
|    │     │  └─ other Target#_runCompilerPlugins                  25 ms
|    │     ├─ Target#_emitResources.............................4,328 ms (1)
|    │     │  ├─ PackageSourceBatch.computeJsOutputFilesMap.....3,324 ms (1)
|    │     │  │  ├─ ImportScanner#getAbsModuleId                   19 ms (1867)
|    │     │  │  ├─ ImportScanner#realPath........................137 ms (1866)
|    │     │  │  │  ├─ optimistic lstat............................96 ms (8150)
|    │     │  │  │  │  ├─ files.lstat                              83 ms (8150)
|    │     │  │  │  │  └─ other optimistic lstat                   13 ms
|    │     │  │  │  ├─ files.realpath                               4 ms (22)
|    │     │  │  │  └─ other ImportScanner#realPath                38 ms
|    │     │  │  ├─ ImportScanner#scanImports for modules...........4 ms (1)
|    │     │  │  │  ├─ ImportScanner#readFile                       1 ms (3)
|    │     │  │  │  └─ other ImportScanner#scanImports for modules  1 ms
|    │     │  │  ├─ ImportScanner#scanImports for promise           1 ms (1)
|    │     │  │  ├─ ImportScanner#scanImports for ecmascript-runtime-client.57 ms (1)
|    │     │  │  │  ├─ ImportScanner#resolve                       19 ms (192)
|    │     │  │  │  ├─ ImportScanner#getAbsModuleId                 1 ms (85)
|    │     │  │  │  ├─ ImportScanner#readFile......................30 ms (85)
|    │     │  │  │  │  ├─ optimistic readFile......................23 ms (85)
|    │     │  │  │  │  │  └─ files.readFile                        23 ms (85)
|    │     │  │  │  │  ├─ optimistic hashOrNull.....................5 ms (85)
|    │     │  │  │  │  │  └─ optimistic readFile....................4 ms (85)
|    │     │  │  │  │  │     └─ files.readFile                      4 ms (85)
|    │     │  │  │  │  └─ other ImportScanner#readFile              1 ms
|    │     │  │  │  ├─ DefaultHandlers.js                           1 ms (85)
|    │     │  │  │  └─ other ImportScanner#scanImports for ecmascript-runtime-client 5 ms
|    │     │  │  ├─ ImportScanner#scanImports for react-fast-refresh.2 ms (1)
|    │     │  │  │  └─ ImportScanner#readFile                       1 ms (3)
|    │     │  │  ├─ ImportScanner#scanImports for base64            2 ms (1)
|    │     │  │  ├─ ImportScanner#scanImports for ejson             2 ms (1)
|    │     │  │  ├─ ImportScanner#scanImports for random            3 ms (1)
|    │     │  │  ├─ ImportScanner#scanImports for minimongo.........4 ms (1)
|    │     │  │  │  ├─ files.stat                                   1 ms (18)
|    │     │  │  │  └─ other ImportScanner#scanImports for minimongo 1 ms
|    │     │  │  ├─ ImportScanner#scanImports for ddp-common        2 ms (1)
|    │     │  │  ├─ ImportScanner#scanImports for ddp-client........3 ms (1)
|    │     │  │  │  └─ files.stat                                   1 ms (20)
|    │     │  │  ├─ ImportScanner#scanImports for mongo             1 ms (1)
|    │     │  │  ├─ ImportScanner#scanImports for cultofcoders:redis-oplog 2 ms (1)
|    │     │  │  ├─ ImportScanner#scanImports for accounts-base     1 ms (1)
|    │     │  │  ├─ ImportScanner#scanImports for oauth             1 ms (1)
|    │     │  │  ├─ ImportScanner#scanImports for tmeasday:check-npm-versions 3 ms (1)
|    │     │  │  ├─ ImportScanner#scanImports for aldeed:collection2 2 ms (1)
|    │     │  │  ├─ ImportScanner#scanImports for http              1 ms (1)
|    │     │  │  ├─ ImportScanner#scanImports for the app.......2,760 ms (1)
|    │     │  │  │  ├─ files.stat                                 304 ms (5987)
|    │     │  │  │  ├─ sha1                                         1 ms (52)
|    │     │  │  │  ├─ Babel.compile                              577 ms (685)
|    │     │  │  │  ├─ ImportScanner#findImportedModuleIdentifiers.81 ms (2449)
|    │     │  │  │  │  ├─ sha1                                     15 ms (1328)
|    │     │  │  │  │  └─ other ImportScanner#findImportedModuleIdentifiers 66 ms
|    │     │  │  │  ├─ ImportScanner#resolve......................164 ms (13138)
|    │     │  │  │  │  ├─ ImportScanner#addPkgJsonToOutput.........23 ms (3095)
|    │     │  │  │  │  │  ├─ ImportScanner#getAbsModuleId           3 ms (290)
|    │     │  │  │  │  │  ├─ sha1                                   2 ms (290)
|    │     │  │  │  │  │  ├─ ImportScanner#resolvePkgJsonBrowserAliases 3 ms (290)
|    │     │  │  │  │  │  └─ other ImportScanner#addPkgJsonToOutput 15 ms
|    │     │  │  │  │  └─ other ImportScanner#resolve             141 ms
|    │     │  │  │  ├─ ImportScanner#getAbsModuleId                19 ms (1785)
|    │     │  │  │  ├─ ImportScanner#realPath.....................197 ms (1785)
|    │     │  │  │  │  ├─ optimistic lstat........................147 ms (10381)
|    │     │  │  │  │  │  ├─ files.lstat                          127 ms (10381)
|    │     │  │  │  │  │  └─ other optimistic lstat                20 ms
|    │     │  │  │  │  └─ other ImportScanner#realPath             50 ms
|    │     │  │  │  ├─ ImportScanner#readFile.....................970 ms (1765)
|    │     │  │  │  │  ├─ optimistic readFile.....................742 ms (1765)
|    │     │  │  │  │  │  ├─ files.readFile                       734 ms (1765)
|    │     │  │  │  │  │  └─ other optimistic readFile              9 ms
|    │     │  │  │  │  ├─ optimistic hashOrNull...................174 ms (1765)
|    │     │  │  │  │  │  ├─ optimistic readFile..................123 ms (1765)
|    │     │  │  │  │  │  │  ├─ files.readFile                    118 ms (1765)
|    │     │  │  │  │  │  │  └─ other optimistic readFile           5 ms
|    │     │  │  │  │  │  ├─ sha1                                  40 ms (1765)
|    │     │  │  │  │  │  └─ other optimistic hashOrNull           11 ms
|    │     │  │  │  │  └─ other ImportScanner#readFile             53 ms
|    │     │  │  │  ├─ DefaultHandlers.js..........................59 ms (1740)
|    │     │  │  │  │  ├─ reifyCompileWithCache                    22 ms (1740)
|    │     │  │  │  │  └─ other DefaultHandlers.js                 37 ms
|    │     │  │  │  ├─ DefaultHandlers.json                        20 ms (23)
|    │     │  │  │  └─ other ImportScanner#scanImports for the app 368 ms
|    │     │  │  ├─ ImportScanner#scanMissingModules for the app....4 ms (2)
|    │     │  │  │  └─ ImportScanner#readFile.......................2 ms (3)
|    │     │  │  │     └─ optimistic readFile.......................2 ms (3)
|    │     │  │  │        └─ files.readFile                         2 ms (3)
|    │     │  │  ├─ ImportScanner#scanMissingModules for socket-stream-client 2 ms (1)
|    │     │  │  ├─ ImportScanner#scanMissingModules for react-meteor-data.3 ms (1)
|    │     │  │  │  └─ files.stat                                   1 ms (14)
|    │     │  │  ├─ PackageSourceBatch._watchOutputFiles..........252 ms (1)
|    │     │  │  │  ├─ optimistic hashOrNull......................241 ms (2181)
|    │     │  │  │  │  ├─ optimistic readFile.....................196 ms (2181)
|    │     │  │  │  │  │  ├─ files.readFile                       190 ms (2181)
|    │     │  │  │  │  │  └─ other optimistic readFile              6 ms
|    │     │  │  │  │  ├─ sha1                                     35 ms (2181)
|    │     │  │  │  │  └─ other optimistic hashOrNull              10 ms
|    │     │  │  │  └─ other PackageSourceBatch._watchOutputFiles  10 ms
|    │     │  │  └─ other PackageSourceBatch.computeJsOutputFilesMap 43 ms
|    │     │  ├─ PackageSourceBatch#getResources..................702 ms (77)
|    │     │  │  ├─ PackageSourceBatch#_linkJS....................700 ms (77)
|    │     │  │  │  ├─ sha1                                         5 ms (214)
|    │     │  │  │  ├─ linker File#getPrelinkedOutput               4 ms (1)
|    │     │  │  │  ├─ linker.fullLink............................483 ms (1)
|    │     │  │  │  │  ├─ linker Module#getPrelinkedFiles.........476 ms (1)
|    │     │  │  │  │  │  ├─ linker File#getPrelinkedOutput         3 ms (238)
|    │     │  │  │  │  │  ├─ getPrelinkedFiles toStringWithSourceMap 310 ms (1)
|    │     │  │  │  │  │  └─ other linker Module#getPrelinkedFiles 163 ms
|    │     │  │  │  │  └─ other linker.fullLink                     7 ms
|    │     │  │  │  ├─ files.rm_recursive                          22 ms (1)
|    │     │  │  │  ├─ files.writeFileAtomically...................77 ms (1)
|    │     │  │  │  │  └─ files.writeFile                          76 ms (1)
|    │     │  │  │  └─ other PackageSourceBatch#_linkJS           109 ms
|    │     │  │  └─ other PackageSourceBatch#getResources           3 ms
|    │     │  ├─ sha512                                            38 ms (1530)
|    │     │  ├─ sha1                                               6 ms (1550)
|    │     │  └─ other Target#_emitResources                      258 ms
|    │     ├─ Target#minifyJs.....................................154 ms (1)
|    │     │  ├─ sha512                                            21 ms (78)
|    │     │  └─ other Target#minifyJs                            132 ms
|    │     ├─ ClientTarget#minifyCss                              187 ms (1)
|    │     ├─ Target#rewriteSourceMaps                              1 ms (1)
|    │     ├─ sha512                                               56 ms (1609)
|    │     ├─ sha1                                                  7 ms (1609)
|    │     └─ other Target#make                                    33 ms
|    ├─ bundler writeTargetToPath.................................290 ms (1)
|    │  ├─ ClientTarget#write.....................................288 ms (1)
|    │  │  ├─ sha512                                                2 ms (10)
|    │  │  ├─ bundler writeFile....................................23 ms (1660)
|    │  │  │  ├─ Builder#_ensureDirectory                          11 ms (1659)
|    │  │  │  ├─ Builder#write......................................3 ms (1)
|    │  │  │  │  └─ files.rename                                    2 ms (1)
|    │  │  │  └─ other bundler writeFile                            9 ms
|    │  │  ├─ Builder#write........................................55 ms (1569)
|    │  │  │  ├─ Builder#_ensureDirectory                          10 ms (1569)
|    │  │  │  ├─ sha1                                              22 ms (1569)
|    │  │  │  ├─ files.writeFile                                    2 ms (1)
|    │  │  │  ├─ files.rename                                       3 ms (1)
|    │  │  │  └─ other Builder#write                               18 ms
|    │  │  ├─ files.writeFile                                       2 ms (1)
|    │  │  └─ other ClientTarget#write                            205 ms
|    │  └─ Builder#complete                                         1 ms (1)
|    └─ other bundler.bundle                                       32 ms
| 
| Top leaves:
| files.readFile..........................................14,219 ms (133830)
| other compileUnibuild (the app)..........................4,026 ms (3)
| sha1.......................................................948 ms (74857)
| Babel.compile..............................................584 ms (765)
| other optimistic readFile..................................494 ms (133577)
| other optimistic hashOrNull................................412 ms (67873)
| other ImportScanner#scanImports for the app................368 ms (1)
| files.stat.................................................319 ms (6253)
| getPrelinkedFiles toStringWithSourceMap....................310 ms (1)
| other Target#_emitResources................................258 ms (1)
| files.lstat................................................220 ms (19082)
| other ClientTarget#write...................................205 ms (1)
| other linker Module#getPrelinkedFiles......................163 ms (1)
| other ImportScanner#resolve................................141 ms (13138)
| other Target#minifyJs......................................132 ms (1)
| sha512.....................................................118 ms (3238)
| other PackageSourceBatch#_linkJS...........................109 ms (77)
| 
| (#221) Total: 24,247 ms (Rebuild App)
| 

And here is my packages, in case it is relevant (Meteor 2.12)

meteor-base@1.5.1             # Packages every Meteor app needs to have
mongo@1.16.6                   # The database Meteor supports right now
tracker@1.3.2                 # Meteor's client-side reactive programming library
cultofcoders:redis-oplog
fortawesome:fontawesome
reactive-var@1.0.12
email@2.2.5
check@1.3.2
gadicohen:sitemaps
accounts-base@2.2.8
accounts-facebook@1.3.3
service-configuration@1.3.1
standard-minifier-js@2.8.1
random@1.2.1
zeroasterisk:throttle
dynamic-import@0.7.3
fourseven:scss@4.5.4
seba:minifiers-autoprefixer
tmeasday:acceptance-test-driver
react-meteor-data
aldeed:collection2
accounts-password@2.3.4
oauth@2.2.0
ecmascript@0.16.7
static-html@1.3.2
hot-module-replacement@0.5.3
meteortesting:mocha
percolate:migrations
lmieulet:meteor-coverage

disable-oplog@1.0.7
http
typescript@4.9.4