ã¯ããã« ããã«ã¡ã¯ïŒã«ã€ãã±ã®ãªãã¥ãŒã¢ã«ãããžã§ã¯ããæ
åœããŠãããšã³ãžãã¢ã®Nobã§ãã æ®æ®µã¯Webã®ããã³ããšã³ããäžå¿ã§ãããæè¿ã¯ã¢ãããããšãããŠããã¯ãšã³ãã®ã¿ã¹ã¯ã«ããã£ã¬ã³ãžãããŠããã£ãŠããŸãã ãã©ã€ããŒãã§ã¯2æ³ã«ãªã£ãã°ããã®æ¯åã®åè²ãŠã«å¥®éäžã§ããæè¿ã¯è©±ããèšèãå¢ããŠå°ãäŒè©±ãæãç«ã€ããã«ãªã£ãŠããããé ããžã®å€åºã§ãæ³£ããªããªã£ãŠããŸãããåè²ãŠã¯å€§å€ã§ããããã以äžã«åäŸããããããã®ç¬é¡ãšå¹žçŠæãããã£ãŠããŸãã ããŠãä»åã¯ESLintã«è¿œå ãããMultithread Lintingã«ã€ããŠãç§ãæºãã£ãŠãããããžã§ã¯ãã®CIãžã®å°å
¥ãæ€èšããã®ã§å
±æããŸãïŒ Multithread Linting æ©èœã®æŠèŠ ESLint v9.34.0ã§è¿œå ããããã®æ©èœã¯ããã®åã®ãšããESLintã«ãããã§ãã¯åŠçã䞊è¡ããŠå®è¡ããããšã«ãã£ãŠé«éåãããã®ã§ãããªãªãŒã¹ãšãšãã« å
¬éããã Blog ã«ãããšã1.3åãã3åã»ã©é«éåããäŸãããããã§ããå€§èŠæš¡ãªã³ãŒãããŒã¹ã§éçºããŠããæã
ãšããŠãé«éåãæåŸ
ã§ããããªã®ã§è©ŠããŠã¿ãããšã«ããŸããã concurrency ãªãã·ã§ã³ã®èšå®å€ concurrencyã«æå®å¯èœãªå€ã¯ä»¥äžã®ããããã§ãã æ£ã®æŽæ°: æå€§ã®ã¹ã¬ããæ°ãä»»æã®æ°ãæå®ã auto : CPUã®ã³ã¢æ°ãšå¯Ÿè±¡ãã¡ã€ã«æ°ã«åºã¥ããŠESLintã«äžŠåæ°ã決å®ãããã off : Multithread Lintingæ©èœãç¡å¹ã«ãããããã©ã«ãã auto ãããŸãæ©èœãããã§ããã°ãå®è¡ç°å¢ã«åãããŠå€ã®èª¿æŽãããªããŠæžãã®ã§æéãçãããã§ãããªã®ã§ããŸã㯠auto ãã詊ããŠã¿ãããšã«ããŸãããã ååãã³ãããŒã¯: off vs auto çŸåšã®ç§ã®éçºç«¯æ«ã®ã¹ããã¯ã¯ä»¥äžã§ãã MacBook Pro: 14ã€ã³ãã Nov 2024 CPU: Apple M4 Max ã¡ã¢ãªïŒ 64GB ãã®ç«¯æ«ã§çŸåšç§ãéçºã«æºãã£ãŠãããããžã§ã¯ãã察象ã«ãã©ã®ãããåŠçé床ã«å€åãããã®ãèŠãŠã¿ãŸãããããŸãã¯ESLintã®åŠçé床ã®å€åãæ€èšŒãããã®ã§ã ESLintã®ãã£ãã·ã¥ãå©çšããªãç¶æ
ã§æ¯èŒããŠã¿ãŸãã ãã³ãããŒã¯ã«ã¯ hyperfine ãšããã³ãã³ãã©ã€ã³ãã³ãããŒã¯ããŒã«ã䜿çšããŸãã hyperfine --warmup 1 --runs 3 -L concurrency off,auto " pnpm exec eslint --concurrency {concurrency} './**/*.{ts,tsx,graphql}' " Benchmark 1: pnpm exec eslint --concurrency off ' ./**/*.{ts,tsx,graphql} ' Time ( mean ± Ï ) : 62 . 363 s ± 0 . 257 s [ User: 74 . 000 s, System: 10 . 615 s ] Range ( min ⊠max ) : 62 . 110 s ⊠62 . 624 s 3 runs Benchmark 2: pnpm exec eslint --concurrency auto ' ./**/*.{ts,tsx,graphql} ' Time ( mean ± Ï ) : 76 . 222 s ± 1 . 714 s [ User: 262 . 973 s, System: 138 . 288 s ] Range ( min ⊠max ) : 74 . 245 s ⊠77 . 297 s 3 runs Summary pnpm exec eslint --concurrency off ' ./**/*.{ts,tsx,graphql} ' ran 1 . 22 ± 0 . 03 times faster than pnpm exec eslint --concurrency auto ' ./**/*.{ts,tsx,graphql} ' 詊ããçµæãæåŸ
ãšã¯éã£ãŠ --concurrency auto ãæå®ããå Žåã®æ¹ã1.22åæéããããããã«ãªã£ãŠããŸããŸããããªããã®ãããªçµæã«ãªã£ãŠããŸãã®ãå°ã調ã¹ãŠã¿ãŸãããã auto ã¢ãŒãã®äžŠåæ°æ±ºå®ããžã㯠ãŸã㯠--concurrency auto ãæå®ããå ŽåãäžŠåæ°ãã©ã®ãããªåŠçã§æ±ºå®ãããã®ã調ã¹ãŠã¿ãŸãã concurrency ãšããããŒã¯ãŒãã§grepããŠESLintã®ã³ãŒããçºããŠã¿ããšãã©ããã ãã®ãããã®åŠç ã§å€æããŠããããã§ãã case "auto" : { workerCount = Math . min ( availableParallelism() >> 1 , Math . ceil (fileCount / AUTO_FILES_PER_WORKER), ); break ; åšèŸºã³ãŒããå«ããŠå°ãåã¿ç ããŠèŠãŠãããš availableParallelism() >> 1 ãã® availableParallelism() ã¯Node.jsã®æšæºã©ã€ãã©ãªã® os.availableParallelism() ã§ããããã®å®äœã¯ libuv ã® uv_available_parallelism() ãOSãCPUã«ãã现ããªéãã¯ãããã®ã®ãã·ã³ãã«ã«èšãã°ããã»ã¹ãå©çšå¯èœãªCPUã®ã³ã¢æ°ãè¿ãã availableParallelism() ã®çµæã1ãããå³ã«ã·ããïŒ2ã§å²ã£ãŠå°æ°ãåãæšãŠïŒããå€ãšãªãã Math.ceil(fileCount / AUTO_FILES_PER_WORKER) fileCount ã¯å¯Ÿè±¡ãã¡ã€ã«æ°ã AUTO_FILES_PER_WORKER 㯠35 ãšãã宿° ã ãã®å€ã¯ãã¥ãŒãªã¹ãã£ãã¯ãªå€ã§ãããå°æ¥çã«ããé©åãªå€ãç®åºåŠçã«æ¹åãããå¯èœæ§ãããã ã®ããã«èªã¿ãšãããšãã§ããŸããæçµçã«ã¯ããããã®å€ã®ããå°ããæ¹ãäžŠåæ°ãšããŠäœ¿çšãããããšã«ãªããŸãã ãããæãåã£ãŠåçŽã«ãããš Math.min(CPU ã®ã³ã¢æ°ã®åæ°, ãã¡ã€ã«æ° / 35) ãšãªããŸãã ã§ã¯ããã§ ãã¡ã€ã«æ° / 35 ãå®éã«ã©ã®ãããã®å€ã«ãªãã®ãèããŠã¿ãŸãããã 100 / 35 => 2.8⊠300 / 35 => 8.5⊠500 / 35 => 14.2⊠ã®ããã«ãªãããã®å€ã®æ¯èŒå¯Ÿè±¡ãCPUã®ã³ã¢æ°ã®åæ°ã§ããããšãèæ
®ãããšã察象ãã¡ã€ã«ã500以äžãããããªæ¯èŒçå€§èŠæš¡ãªãããžã§ã¯ãã§ã¯CPUã®ã³ã¢æ°ã®åæ°ãäžŠåæ°ã«ãªããšèããããšãã§ããŸãã æ€èšŒç«¯æ«ã§ã®äžŠåæ°èšç®çµæ åè¿°ã®ãšãããäžŠåæ°ã®ç®åºã«ã¯CPUã®ã³ã¢æ°ãšå¯Ÿè±¡ã®ãã¡ã€ã«æ°ãé¢ä¿ããŠããã®ã§ãããä»åæ€èšŒã«äœ¿ã£ãŠãããããžã§ã¯ãã«ã¯4,000ãã¡ã€ã«ä»¥äžãååšããŠããŸãã察象ãã¡ã€ã«æ°ãååã«å€ããããäžŠåæ°ã¯CPUã®ã³ã¢æ°ã§æ±ºãŸããšèããããšãã§ãããã§ãã æ€èšŒã«äœ¿ã£ãŠããéçºç«¯æ«ã®CPUã¯Apple M4 Maxã§ããããã®ç°å¢ã§ availableParallelism() ãè¿ãå€ã¯16ã§ãã node -p " require('node:os').availableParallelism() " 16 ãã®å€ã2ã§å²ã£ãå€ãã€ãŸã8ãäžŠåæ°ãšããŠå©çšãããããšã«ãªããŸããå®éã«äžŠåæ°ãšããŠäœ¿çšãããå€ã¯ESLintã®å®è¡æã« --debug ãªãã·ã§ã³ãæå®ããããšã§åºåããããã°ããã確èªããããšãã§ããŸãã eslint:eslint Linting using 8 worker thread ( s ) . ããã§Apple M4 Maxã®ã³ã¢ã®å
èš³ãèŠãŠã¿ãŸãããã 12åãPerformanceã³ã¢ã§4åãEfficiencyã³ã¢ã§ãã Performanceã³ã¢ã¯é«ãã¯ããã¯åšæ³¢æ°ã§åäœããCPUéçŽçãªã¿ã¹ã¯ãåããŠããã³ã¢ã§ã Efficiencyã³ã¢ã¯äœæ¶è²»é»åã§åäœããé»åæ¶è²»å¹çãéèŠããã³ã¢ã§ãã äžæ¹Node.jsãå©çšããŠããlibuvã® uv_available_parallelism() ã§ã¯ãããã®ã³ã¢ã®éããç¥ãããšã¯ã§ããŸããã 16åã®ãã¡ã®4åãä»ã®ã³ã¢ãããæ§èœãäœãããšãèæ
®ãããšã 8ãšããäžŠåæ°ã¯å®éã®ã¹ããã¯ãããé«ãå€ãªã®ãããããªãããšãã仮説ãããŠãããšãã§ããŸãã æé©ãªäžŠåæ°ã®æ¢çŽ¢ ããã§ã¯å®éã«8以äžã®äžŠåæ°ã§æ¹ããŠæ€èšŒããŠã¿ãŸãããã hyperfine --runs 1 -L concurrency off, 2 , 3 , 4 , 5 , 6 , 7 ,auto " pnpm exec eslint --concurrency {concurrency} './**/*.{ts,tsx,graphql}' " Benchmark 1: pnpm exec eslint --concurrency off ' ./**/*.{ts,tsx,graphql} ' Time ( abs â¡ ) : 64 . 260 s [ User: 75 . 702 s, System: 11 . 435 s ] Benchmark 2: pnpm exec eslint --concurrency 2 ' ./**/*.{ts,tsx,graphql} ' Time ( abs â¡ ) : 51 . 809 s [ User: 108 . 378 s, System: 22 . 637 s ] Benchmark 3: pnpm exec eslint --concurrency 3 ' ./**/*.{ts,tsx,graphql} ' Time ( abs â¡ ) : 48 . 950 s [ User: 135 . 421 s, System: 35 . 065 s ] Benchmark 4: pnpm exec eslint --concurrency 4 ' ./**/*.{ts,tsx,graphql} ' Time ( abs â¡ ) : 49 . 328 s [ User: 163 . 220 s, System: 50 . 156 s ] Benchmark 5: pnpm exec eslint --concurrency 5 ' ./**/*.{ts,tsx,graphql} ' Time ( abs â¡ ) : 52 . 281 s [ User: 187 . 664 s, System: 67 . 241 s ] Benchmark 6: pnpm exec eslint --concurrency 6 ' ./**/*.{ts,tsx,graphql} ' Time ( abs â¡ ) : 59 . 303 s [ User: 216 . 758 s, System: 91 . 124 s ] Benchmark 7: pnpm exec eslint --concurrency 7 ' ./**/*.{ts,tsx,graphql} ' Time ( abs â¡ ) : 67 . 345 s [ User: 236 . 109 s, System: 113 . 020 s ] Benchmark 8: pnpm exec eslint --concurrency auto ' ./**/*.{ts,tsx,graphql} ' Time ( abs â¡ ) : 72 . 838 s [ User: 263 . 605 s, System: 133 . 785 s ] Summary pnpm exec eslint --concurrency 3 ' ./**/*.{ts,tsx,graphql} ' ran 1 . 01 times faster than pnpm exec eslint --concurrency 4 ' ./**/*.{ts,tsx,graphql} ' 1 . 06 times faster than pnpm exec eslint --concurrency 2 ' ./**/*.{ts,tsx,graphql} ' 1 . 07 times faster than pnpm exec eslint --concurrency 5 ' ./**/*.{ts,tsx,graphql} ' 1 . 21 times faster than pnpm exec eslint --concurrency 6 ' ./**/*.{ts,tsx,graphql} ' 1 . 31 times faster than pnpm exec eslint --concurrency off ' ./**/*.{ts,tsx,graphql} ' 1 . 38 times faster than pnpm exec eslint --concurrency 7 ' ./**/*.{ts,tsx,graphql} ' 1 . 49 times faster than pnpm exec eslint --concurrency auto ' ./**/*.{ts,tsx,graphql} ' ã©ãããç§ã®ç«¯æ«ã§ã¯æç€ºçã« --concurrency 3 ãæå®ããããšã§ off ã®å Žåããã1.31åã auto ã®å Žåããã1.49åé«éãªããã§ãã concurrency auto ãæå®ãããšé
ããªã£ãŠããŸããã®ã®ãé©åãªäžŠåæ°ãæç€ºçã«æå®ããããšã§è¯ãããã©ãŒãã³ã¹ãåŸãããšãã§ãããã§ãã ãã£ãã·ã¥æå¹æã®æ§èœæ¯èŒ ãããŸã§ã¯ESLintã®ãã£ãã·ã¥ãç¡å¹ãªç¶æ
ã§æ€èšŒãããŠããŸãããæ¬¡ã¯ESLintã®ãã£ãã·ã¥ãæå¹ãªç¶æ
ã¯ã©ã®ãããªçµæã«ãªãã詊ããŠã¿ãŸãã hyperfine --warmup 1 --runs 3 -L concurrency off, 3 " pnpm exec eslint --cache --concurrency {concurrency} './**/*.{ts,tsx,graphql}' " Benchmark 1: pnpm exec eslint --cache --concurrency off ' ./**/*.{ts,tsx,graphql} ' Time ( mean ± Ï ) : 2 . 516 s ± 0 . 044 s [ User: 2 . 006 s, System: 0 . 578 s ] Range ( min ⊠max ) : 2 . 470 s ⊠2 . 557 s 3 runs Benchmark 2: pnpm exec eslint --cache --concurrency 3 ' ./**/*.{ts,tsx,graphql} ' Time ( mean ± Ï ) : 4 . 574 s ± 0 . 037 s [ User: 6 . 710 s, System: 2 . 061 s ] Range ( min ⊠max ) : 4 . 540 s ⊠4 . 614 s 3 runs Summary pnpm exec eslint --cache --concurrency off ' ./**/*.{ts,tsx,graphql} ' ran 1 . 82 ± 0 . 04 times faster than pnpm exec eslint --cache --concurrency 3 ' ./**/*.{ts,tsx,graphql} ' ä»åã®æ€èšŒã§ã¯ãã¹ãŠã®ãã¡ã€ã«ã«å¯Ÿãããã£ãã·ã¥ãæå¹ãªç¶æ
ã§è©ŠããŠããã®ã§æ¥µç«¯ãªäŸã§ã¯ãããŸããããã®å Žåã¯çŽåã§å®è¡ããã»ããè¯ãçµæãåŸãããšãã§ããŸããã ãããŸã§ã®æŽçã®ããã«ãåããªãã·ã§ã³ã«å ããŠãã£ãã·ã¥ãç¡å¹ãªå Žåãå«ããŠæ¯èŒããŠã¿ãŸãããã hyperfine --warmup 1 --runs 3 -L cache --cache,--no-cache -L concurrency off, 3 " pnpm exec eslint {cache} --concurrency {concurrency} './**/*.{ts,tsx,graphql}' " Benchmark 1: pnpm exec eslint --cache --concurrency off ' ./**/*.{ts,tsx,graphql} ' Time ( mean ± Ï ) : 2 . 417 s ± 0 . 026 s [ User: 1 . 886 s, System: 0 . 534 s ] Range ( min ⊠max ) : 2 . 391 s ⊠2 . 442 s 3 runs Benchmark 2: pnpm exec eslint --cache --concurrency 3 ' ./**/*.{ts,tsx,graphql} ' Time ( mean ± Ï ) : 4 . 508 s ± 0 . 031 s [ User: 6 . 682 s, System: 2 . 051 s ] Range ( min ⊠max ) : 4 . 473 s ⊠4 . 530 s 3 runs Benchmark 3: pnpm exec eslint --no-cache --concurrency off ' ./**/*.{ts,tsx,graphql} ' Time ( mean ± Ï ) : 59 . 652 s ± 0 . 536 s [ User: 73 . 527 s, System: 10 . 505 s ] Range ( min ⊠max ) : 59 . 221 s ⊠60 . 253 s 3 runs Benchmark 4: pnpm exec eslint --no-cache --concurrency 3 ' ./**/*.{ts,tsx,graphql} ' Time ( mean ± Ï ) : 49 . 708 s ± 0 . 678 s [ User: 134 . 778 s, System: 34 . 085 s ] Range ( min ⊠max ) : 48 . 982 s ⊠50 . 323 s 3 runs Summary pnpm exec eslint --cache --concurrency off ' ./**/*.{ts,tsx,graphql} ' ran 1 . 86 ± 0 . 02 times faster than pnpm exec eslint --cache --concurrency 3 ' ./**/*.{ts,tsx,graphql} ' 20 . 56 ± 0 . 35 times faster than pnpm exec eslint --no-cache --concurrency 3 ' ./**/*.{ts,tsx,graphql} ' 24 . 68 ± 0 . 34 times faster than pnpm exec eslint --no-cache --concurrency off ' ./**/*.{ts,tsx,graphql} ' ãã®çµæãããä»åã®ç°å¢ã§ã¯ ãã£ãã·ã¥ãæå¹ãªãçŽåã®ã»ããéã ãã£ãã·ã¥ãç¡å¹ãªã䞊åã®ã»ããéã ãšããããšãèšãããã§ãã CI ç°å¢ãžã®é©çšå€æ ãã®ãããžã§ã¯ãã§ã¯CIã§ESLintãå®è¡ããŠããã®ã§ãæåŸã«CIã§ESLintã® concurrency ãªãã·ã§ã³ã远å ããã¹ããæ€èšããŠã¿ãŸãã åæãšããŠããã®ãããžã§ã¯ãã¯Turborepoãå°å
¥ãããŠããŸããTurborepoã¯è€æ°ã®ããã±ãŒãžãããªãã¢ãã¬ãã«ãããŠããã«ãããã¹ããªã©ã®ã¿ã¹ã¯ãå¹ççã«å®è¡ããããŒã«ã§ããä¿®æ£ãããã¡ã€ã«ã®ç¯å²ã«ãããŸããããã®ãããžã§ã¯ãã¯æå€§ã§9ã€ã®ããã±ãŒãžã«å¯ŸããŠESLintãå®è¡ãããããšã«ãªããŸããTurborepoã§ããããã®ããã±ãŒãžãžã®ã³ãã³ãã䞊åå®è¡ããããšã«ãªãããã ESLintã® concurrency ãªãã·ã§ã³ã䜿ããšéå°ãªäžŠåæ°ã«ãªã£ãŠããŸããè¯ãããã©ãŒãã³ã¹ãåŸãããªãå¯èœæ§ãããããã§ãã å®éã«è©ŠããŠã¿ãŸãããã以äžã§ã¯turboã³ãã³ããçµç±ããŠfmtã³ãã³ããå®è¡ããŠããŸãããããã¯æŠã eslint --cache --fix './**/*.{ts,tsx,graphql}' ã§ãããšæã£ãŠããã ããŠæ§ããŸããã hyperfine --warmup 1 --runs 3 -L concurrency off, 2 , 3 " pnpm exec turbo run --cache local:w,remote:w fmt -- --concurrency {concurrency} " Benchmark 1: pnpm exec turbo run --cache local:w,remote:w fmt -- --concurrency off Time ( mean ± Ï ) : 4 . 561 s ± 0 . 290 s [ User: 2 . 431 s, System: 0 . 870 s ] Range ( min ⊠max ) : 4 . 376 s ⊠4 . 895 s 3 runs Benchmark 2: pnpm exec turbo run --cache local:w,remote:w fmt -- --concurrency 2 Time ( mean ± Ï ) : 6 . 291 s ± 0 . 075 s [ User: 5 . 689 s, System: 1 . 793 s ] Range ( min ⊠max ) : 6 . 208 s ⊠6 . 353 s 3 runs Benchmark 3: pnpm exec turbo run --cache local:w,remote:w fmt -- --concurrency 3 Time ( mean ± Ï ) : 6 . 322 s ± 0 . 012 s [ User: 7 . 296 s, System: 2 . 287 s ] Range ( min ⊠max ) : 6 . 315 s ⊠6 . 335 s 3 runs Summary pnpm exec turbo run --cache local:w,remote:w fmt -- --concurrency off ran 1 . 38 ± 0 . 09 times faster than pnpm exec turbo run --cache local:w,remote:w fmt -- --concurrency 2 1 . 39 ± 0 . 09 times faster than pnpm exec turbo run --cache local:w,remote:w fmt -- --concurrency 3 ãã¯ãçŽåã§å®è¡ããã»ããããè¯ãããã©ãŒãã³ã¹ãåŸãããšãã§ãããã§ãã ãããã®åŠçã¯GitHub Actionsã§GitHubã®Pull-Requestã«å¯ŸããŠå®è¡ãããããã«ããŠããŸãããã»ãšãã©ã®Pull-Requestã§ã¯äžåºŠã«å€§éã®ãã¡ã€ã«ãä¿®æ£ããããšã¯ãããŸãããã€ãŸãå€ãã®ã±ãŒã¹ã§ã¯ESLintã®ãã£ãã·ã¥ã¯å€§å€æ°ã®ãã¡ã€ã«ã§æå¹ãªç¶æ
ã§ãããšèããããšãã§ããŸãã ãŸããã®ã¯ãŒã¯ãããŒã¯Ubuntuã®4ã³ã¢ã§å®è¡ããããã«ããŠããŸãããã³ã¢æ°ãå°ãªããããããªã䞊ååã«ãã£ãŠããè¯ãããã©ãŒãã³ã¹ãåŸãããèŠèŸŒã¿ã¯èããã§ãã å®éã«ãã®ã¯ãŒã¯ãããŒã§ãã³ãããŒã¯ããçµæã以äžã§ãã hyperfine --warmup 1 --runs 3 -L concurrency off, 2 , 3 , 4 ,auto " pnpm exec turbo run --cache local:w,remote:w fmt -- --cache-strategy content --concurrency {concurrency} " Benchmark 1: pnpm exec turbo run --cache local:w,remote:w fmt -- --cache-strategy content --concurrency off Time ( mean ± Ï ) : 13 . 241 s ± 0 . 038 s [ User: 41 . 594 s, System: 5 . 830 s ] Range ( min ⊠max ) : 13 . 204 s ⊠13 . 280 s 3 runs Benchmark 2: pnpm exec turbo run --cache local:w,remote:w fmt -- --cache-strategy content --concurrency 2 Time ( mean ± Ï ) : 31 . 019 s ± 0 . 075 s [ User: 104 . 797 s, System: 13 . 536 s ] Range ( min ⊠max ) : 30 . 954 s ⊠31 . 102 s 3 runs Benchmark 3: pnpm exec turbo run --cache local:w,remote:w fmt -- --cache-strategy content --concurrency 3 Time ( mean ± Ï ) : 39 . 606 s ± 0 . 037 s [ User: 136 . 718 s, System: 17 . 224 s ] Range ( min ⊠max ) : 39 . 568 s ⊠39 . 643 s 3 runs Benchmark 4: pnpm exec turbo run --cache local:w,remote:w fmt -- --cache-strategy content --concurrency 4 Time ( mean ± Ï ) : 48 . 413 s ± 0 . 007 s [ User: 169 . 105 s, System: 21 . 288 s ] Range ( min ⊠max ) : 48 . 406 s ⊠48 . 420 s 3 runs Benchmark 5: pnpm exec turbo run --cache local:w,remote:w fmt -- --cache-strategy content --concurrency auto Time ( mean ± Ï ) : 27 . 108 s ± 0 . 056 s [ User: 91 . 045 s, System: 11 . 620 s ] Range ( min ⊠max ) : 27 . 063 s ⊠27 . 170 s 3 runs Summary pnpm exec turbo run --cache local:w,remote:w fmt -- --cache-strategy content --concurrency off ran 2 . 05 ± 0 . 01 times faster than pnpm exec turbo run --cache local:w,remote:w fmt -- --cache-strategy content --concurrency auto 2 . 34 ± 0 . 01 times faster than pnpm exec turbo run --cache local:w,remote:w fmt -- --cache-strategy content --concurrency 2 2 . 99 ± 0 . 01 times faster than pnpm exec turbo run --cache local:w,remote:w fmt -- --cache-strategy content --concurrency 3 3 . 66 ± 0 . 01 times faster than pnpm exec turbo run --cache local:w,remote:w fmt -- --cache-strategy content --concurrency 4 ã©ããããã®ãããžã§ã¯ãã®ESLintã«ã¯ concurrency ãªãã·ã§ã³ã¯è¿œå ãããTurborepoã«ãã䞊ååã®ã¿ã«çããã»ããããããã§ãã ãŸãšã 以äžã ESLintã®Multithread Lintingã®å°å
¥ãæ€èšããéã«æ€èšŒããããšã§ããïŒ ä»åæ€èšŒãããããžã§ã¯ãã®CIã«ã¯ concurrency ãªãã·ã§ã³ã®è¿œå ã¯èŠéããŸããããäžå®ã®æ¡ä»¶äžã§ããã° concurrency ãªãã·ã§ã³ã䜿ãããšã§ESLintã®åŠçãé«éåããããšãã§ããŸããããããã®å¹æã¯ã察象ã®ãã¡ã€ã«æ°ãå®è¡ç°å¢ããã£ãã·ã¥ã®æç¡ãªã©ã«ãã£ãŠå€§ããç°ãªããŸããå°å
¥ããåã«å¯Ÿè±¡ã®ç°å¢ãçšéã«åããæ€èšŒããããšããªã¹ã¹ã¡ããŸãã ä»ã«ãããŒã å
ã§ã¯ESLintã®äžéšã®ã«ãŒã«ã oxlint ã«çœ®ãæããŠé«éåã詊ã¿ãåãããããŸããè¯ãçµæãåºãŠããé«éãªCIç°å¢ãæã«å
¥ããšããã§ããïŒ ããã§ã¯ïŒ