z túto odpoveď na príkaze Time Unix dostanem základnú myšlienkuako funguje čas. Vidlica nový proces a vykonanie príkazu v tomto novom procese. Stretol som sa však so správaním, ktorému nie som schopný porozumieť.
Snažím sa vyprofilovať lusearch, referenčná hodnota Porovnávacia sada DaCapo. Chcem ho spustiť s rôznymi konfiguráciami (počet vlákien a počet iterácií), ignorovať výstup benchmarku a použiť čas zaznamenávať reálny, používateľský a systémový čas. Pri veľkej väčšine konfigurácií môj skript funguje dobre, spúšťa test a zaznamenáva čas.
S jednou konkrétnou konfiguráciou (veľká množina údajov,dve vlákna a desať iterácií), referenčná hodnota niekedy nedosiahne ukončenie (80% prípadov, z takmer 100 predbežných). Toto je príkaz, ktorý používam na jeho spustenie:
(time -p java -jar DaCapo.jar lusearch -s large -t 2 -i 10
>/dev/null 2>/dev/null) 2>&1 | awk "{print $2 $4 $6}" > timed &
Ak však nepripravím čas, testovacie obdobie sa na 100% zastaví (tiež asi v 100 predbežných prípadoch):
(java -jar DaCapo.jar lusearch -s large -t 2 -i 10 >/dev/null 2>/dev/null)
Toto správanie sa deje iba s touto referenčnou hodnotou -a s touto konfiguráciou -, zatiaľ čo v prípade, že by bol profil nejakého iného benchmarku alebo by sa použil iný počet vlákien alebo iný počet iterácií, nevidím, aby sa dialo to isté. Myslím, že by to malo súvisieť s niečím, čo je čas zásah do referenčnej hodnoty.
Nechápem, ako by fork + exec mohol zmeniťreferenčné správanie. Je niečo konkrétne, čo to môže spôsobiť? Napríklad: využíva čas nejaký zdroj, ktorý chce použiť aj benchmark? Robím pri zavádzaní benchmarku niečo zlé?
odpovede:
1 pre odpoveď č. 1„Nedosahuje ukončenie“ je dosť vágne. Zmeškáte akékoľvek chybové správy, pretože posielate všetko na /dev/null
. Je nemožné dať jednoznačnú odpoveď bez toho, aby ste vedeli čokoľvek o tom, čo tento program robí, žiadne chybové správy, spätná väzba.
Jediný skutočný rozdiel, na ktorý si myslím, je, že ho v druhom prípade nepodkladám. Bash s určitými kombináciami rúrok a presmerovaní nepresmerováva /dev/null
implicitne stdinovať na pozadí. Je možné, že niektorá časť programu je na to citlivá. Pozri môj vitríny pre niektoré príklady, kde je výslovné presmerovaniepožadovaný. Bash tu úplne nenásleduje POSIX a líši sa od všetkých ostatných shellov určitými kombináciami asynchrónnych zoznamov, rúrok a presmerovaní.
Vážne pochybujem, že to má niečo spoločné time
. Ak tu nedostanete lepšiu odpoveď, môžete sa opýtať na zoznam pomocných programov, ale bez lepších informácií sa im lepšie nedarí.