Zdůvodnění
Shellový nástroj byl dost pomalý na to, aby ho lidé obcházeli: doctor trval deset sekund při každém commitu, protože dva validátory spouštěly jeden proces awk na klíč ve smyčkách nad soubory, které už byly jednou zploštěny, kompilátor znalostí hashoval každý zdroj vlastním procesem a generátor webu sestavoval každý záznam jedním jq na záznam a jedním procesem na seznam. Nic z toho nebyl problém algoritmu. Vše mělo stejný tvar: práce závislá jen na nezměněných kanonických souborech, opakovaná pro každou položku. Proces stojí milisekundy; tisíc procesů stojí nástroj jeho uživatele.
Požadované chování
Loader čte své vstupy jednou a předá výsledek čtenářům: mnoho souborů jedním procesem (mj_yaml_flatten_many, mj_sha256_many), plochý soubor do proměnných jedním procesem (mj_yload, mj_yload_dir), sadu řádků jedním awk. Čtenář rozbaluje to, co bylo načteno; nespouští proces na klíč, na řádek ani na soubor. Příkaz, který opakuje stejné vyhledání ve smyčce, jej ze smyčky vytáhne. Když fáze musí číst mnoho souborů, řekne to jednou, v jednom procesu, a čítače práce to ukážou: MJ_TIMING=1 vypíše pro libovolný příkaz fáze seřazené podle času a počty yaml_flatten, yaml_flatten_many, sha256_many a git, a smyčka, která regredovala na jeden proces na položku, je tam vidět dřív než na hodinách.
Chování při selhání
Žádný příkaz o tomto pravidle nerozhoduje; rozhoduje recenzent, s čítači před sebou. Žádný případ tyto počty zatím nedrží. Ten, který bude, bude držet počty příkazů, které hook pre-commit spouští, vůči počtu odlišných kanonických souborů, které čtou, a změna, která znovu zploští uvnitř smyčky, ho shodí.
Ověření
Revize, s MJ_TIMING=1 bin/majordomus <command> před změnou a po ní, a zpráva commitu nese obě čísla (viz project.performance-evidence).