C-c, hogyan kell mérni a CPU időt

A tolmács:
A legtöbb ember, akit ismerek, hogy idő méréséhez különböző típusú referenciaértékek C ++ segítségével stopper, vagy nagyon előrehaladott esetekben, ctime. De benchmarking sokkal hasznosabb mérni a CPU időt. Nemrég rábukkantam egy cikket a cross-platform CPU mérés és úgy döntött, hogy ossza meg itt, enyhén növelheti a minőségi helyi referenciaértékeket.







Hogyan juthat el a CPU időt

A feldolgozási idő megnő, amikor a folyamat fut, és fogyasztja CPU. Alatt IO, zárak, szálak és egyéb műveletek, amelyek végrehajtásának felfüggesztése a processzor, a processzor időt nem növekszik, amíg a folyamat újra kezdődik, hogy használja a CPU-t.

Egyéb eszközök, mint például a ps POSIX, Activity Monitor OSX és Windows Feladatkezelő, hogy bemutassák a CPU időt, ami az eljárás, de gyakran hasznos nyomon követni, hogy rögtön a folyamat. Ez alatt különösen hasznos összehasonlító algoritmusok, vagy egy kis része egy komplex programot. Annak ellenére, hogy az összes OS egy API, így a CPU időt, mindegyiknek megvan a maga furcsa szokásai.

getCPUTime () függvény. alábbiakban bemutatott, fut a legtöbb operációs rendszer (egyszerűen másolja a kódot, és töltse le a fájlt getCPUTime.c). Amennyiben szükséges, a feszes és librt. hogy POSIX-időzítő (pl AIX, BSD, Cygwin, HP-UX, Linux és Solaris, de nem OSX). Egyébként meglehetősen szabványos könyvtárak.

Ezután azt tárgyaljuk részletesen a jellemzői, részletei és az okok, amelyek a kódot #ifdef „s.

használata

Az intézkedés a feldolgozási idő az algoritmus, hívja getCPUTime () előtt és után megkezdődik az algoritmus, és kiadja a különbséget. Ne gondold, hogy a visszaadott érték, ha egy funkció hívás hordoz némi értelme.

megbeszélés

Minden operációs rendszer egy vagy több módon, hogy a CPU időt. Ugyanakkor bizonyos szempontból pontosabban a többit.

Ezen eljárások mindegyike részletesen tárgyaljuk az alábbiakban.

GetProcessTimes ()

Windows és Cygwin (UNIX-szerű környezetet és parancssori felület Windows), GetProcessTimes () függvény kitölti a szerkezet FILETIME processzor időt, ami az eljárással, és FileTimeToSystemTime () függvény a megadott FILETIME szerkezet SYSTEMTIME szerkezet. tartalmazó használati idő értékét.

Elérhetőség GetProcessTimes (): Cygwin, Windows XP és újabb verziók.

Első CPU idő:

clock_gettme ()

A legtöbb POSIX-kompatibilis operációs rendszer, clock_gettime () (lásd a használati útmutatója az AIX. BSD. HP-UX. Linux és Solaris) a legpontosabb értéket a CPU időt. Az első érv az a funkció kiválasztja az „óra id”, míg a második timespec szerkezetét. által kitöltött használt processzor időt másodpercben és ns. A legtöbb operációs rendszer, a program kell kötni librt.

Azonban vannak olyan finomságok, amelyek megnehezítik, hogy használja ezt a funkciót, egy cross-platform kódot:

  • Funkció egy opcionális része a POSIX szabvány és csak akkor áll rendelkezésre, ha _POSIX_TIMERS meghatározott értéke nagyobb, mint a 0 időpontban, AIX, BSD, HP-UX, Linux és Solaris támogatja ezt a funkciót, de nem támogatja a OSX.
  • Szerkezet timespec. által kitöltött clock_gettime () függvény tárolhat időt ns, de az óra pontatlansága eltérő a különböző operációs rendszerek és a különböző rendszerek. clock_getres () függvény az óra pontatlansága, ha szükség van rá. Ez a funkció ismét egy opcionális része a POSIX szabvány csak ha _POSIX_TIMERS nullánál nagyobb. Ezen a ponton, AIX, BSD, HP-UX, Linux és Solaris ez a funkció, de a Solaris nem működik.
  • POSIX szabvány meghatározza a nevét több rögzített értékek, „óra id”, beleértve CLOCK_PROCESS_CPUTIME_ID. hogy a CPU idő a folyamat. Ma azonban, a BSD és HP-UX nem rendelkezik ezzel id, és ahelyett, meghatározza a saját id CLOCK_VIRTUAL CPU időt. Hogy megzavarja mindenki még, Solaris meghatározza a két használ, de CLOCK_VIRTUAL CPU idő áramlását. és nem a folyamat.

Mi id használni







  • Ahelyett, használja az állandók fenti, clock_getcpuclockid () függvény az időzítő a kiválasztott folyamat. A folyamat a 0 lehetővé teszi, hogy a CPU időt a jelenlegi folyamat. Ez azonban egy másik választható része a POSIX szabvány és csak akkor áll rendelkezésre, ha _POSIX_CPUTIME 0-nál nagyobb Eddig csak AIX és Linux ez a funkció, de linuksovskie include-fájl nem határozzák _POSIX_CPUTIME és visszaadja megbízhatatlan és nem egyeztethető össze a POSIX eredményeket.
  • clock_gettime () funkció beilleszthető egy regiszterrel a processzor időt. A többprocesszoros rendszerek, az egyes processzorok némileg eltérhet időszemléletet, ami miatt a funkció vissza érvénytelen értéket, ha a folyamatot át a processzor CPU. Linux, és csak Linux-on, akkor lehet kimutatni, ha clock_getcpuclockid () függvény egy nem POSIX hiba, és meghatározza, hogy errno ENOENT. Azonban, mint már említettük, a Linux clock_getcpuclockid () megbízhatatlan.

A gyakorlatban azonban mindezen finomságok, használata clock_gettime () megköveteli a sok ellenőrzés segítségével #ifdef és képes váltani egy másik funkciót, ha ez nem működik.

Elérhetőség clock_gettime (): AIX, BSD, Cygwin, HP-UX, Linux és Solaris. De az óra id BSD és HP-UX, nem szabványos.

Elérhetőség clock_getres (): AIX, BSD, Cygwin, HP-UX és Linux alatt, de nem fut a Solaris.

Elérhetőség clock_getcpuclockid (): AIX és Cygwin nem megbízhatatlan Linuxon.

Első CPU idő:

getrusage ()

Minden UNIX-szerű operációs rendszer, a getrusage () függvény a legmegbízhatóbb módja annak, hogy a CPU időt, ami az aktuális folyamat. A függvény kitölti a szerkezet rusage időt másodpercben és ezredmásodperc. ru_utime mező töltött idő a felhasználói módban, és a mező ru_stime - a rendszer módot nevében a folyamatot.

Megjegyzés: Egyes operációs rendszerek, a széles körben elterjedt a 64 bites meghatározott getrusage () függvényt. visszatér egy 32-bites érték, és getrusage64 () függvény. visszaad egy 64 bites érték. Ma getrusage () visszaad egy 64 bites érték, és a getrusage64 () lejárt.

Elérhetőség getrusage (): AIX, BSD, Cygwin, HP-UX, Linux, OSX és Solaris.

Első CPU idő:

Minden UNIX-szerű OS, elavult funkció idők () kitölti a szerkezet TMS, hogy a feldolgozási idő a kullancsok, és sysconf () függvény a kullancsok száma másodpercenként. tms_utime mező töltött idő a felhasználói módban, tms_stime területen - a rendszer módot nevében a folyamatot.

Megjegyzés: Az idősebb függvényjel sysconf (CLK_TCK) lejárt, és nem támogatják az egyes operációs rendszerek. Ha ez nem áll rendelkezésre, sysconf () függvény nem működik normálisan, amikor használja. Használja _SC_CLK_TCK helyett.

Elérhetőség alkalommal (): AIX, BSD, Cygwin, HP-UX, Linux, OSX és Solaris.

Első CPU idő:

Minden UNIX-szerű operációs rendszer, egy nagyon régi clock () függvény visszaadja a CPU idő a folyamat kullancsok, és makro CLOCKS_PER_SEC kullancsok száma másodpercenként.

Megjegyzés: vissza a CPU időt tartalmazza az időt töltött felhasználói módban a rendszer módot nevében a folyamatot.

Megjegyzés: Bár kezdetben CLOCKS_PER_SEC kell vissza értéket függ a processzor, szabványos C ISO C89 és C99, Single UNIX Specification és POSIX szabványok értelmében CLOCKS_PER_SEC 1000000 van egy fix érték, amely korlátozza a pontosságát ezredmásodperc funkciót. A legtöbb operációs rendszer teljesítik ezeket a követelményeket, de a FreeBSD, Cygwin és régebbi verziói OSX használata nem szabványos értékek.

Megjegyzés: AIX és Solaris, clock () függvény a CPU idő és az aktuális folyamat és az összes gyermek folyamat, amelynek szülő teljesítette egyik várakozás () függvényt. rendszer () vagy pclose ().

Megjegyzés: A Windows clock () függvény támogatott, de nem tér vissza a processzor, és valós időben.

Elérhetőség clock (): AIX, BSD, Cygwin, HP-UX, Linux, OSX és Solaris.

Első CPU idő:

más megközelítések

Vannak más OS-specifikus módon, hogy a CPU időt. Linux, BSD Solarisi néhány, akkor elemezni / proc / [pid] / stat. hogy a folyamat statisztika. OSX, saját függvény API proc_pidtaskinfo () visszatér a libproc információt a folyamatot. Vannak is nyílt forráskódú könyvtárakat, mint libproc, procps és sigar.

UNIX, több eszköz, amely lehetővé teszi, hogy megjelenítse a CPU idő a folyamat, beleértve a ps. tetején. mpstat és mások. Ön is használja az időt segédprogramot. megjelenítheti az időt töltött a csapat.

Windows-on, akkor a Task Manager. felhasználásának ellenőrzésére a CPU.

OSX, akkor Activity Monitor. felhasználásának ellenőrzésére a CPU. Utility profilba Instruments szállított Xcode figyelheti a használatát a CPU, valamint sok más dolog.

  • getCPUTime.c végre a fent leírt funkció C. Fordítsuk meg minden C fordító, és a kapcsolat a librt. rendszerekben, ahol ez rendelkezésre áll. A kód licenc alatt a Creative Commons Nevezd meg! 3.0 Unported licenc.

lásd még

Kapcsolódó cikkek NadeauSoftware.com

  • C / C ++ tipp: Hogyan mérjük az eltelt valós időben összehasonlítási elmagyarázza, hogy a valós idejű mérésére eltelt időt egy darab kódot, beleértve a fordított idő I / O vagy felhasználói beavatkozásra.
  • C / C ++ tipp: Hogyan kell használni fordító előre makrók felismerni az operációs rendszer használatát ismerteti makrók #ifdef OS-specifikus kód. Néhány ilyen módszereket használnak ebben a cikkben, hogy meghatározzák a Windows, OSX és UNIX változatok.

Cikkek az interneten

  • Milyen CPU időt a CPU időt a Wikipedia magyarázza.
  • CPU idő vizsgálóbizottság GNU.org elmagyarázza, hogyan kell használni a régi órát () függvényt.
  • Határozzuk meg a CPU-használat jelenlegi eljárás (C ++ és C # kód) és magyarázatot ad a CPU-idő és egyéb statisztikák a Windows.
  • POSIX opciók a Kernel.org magyarázza az opcionális funkciók és a POSIX állandók, beleértve _POSIX_TIMERS és _POSIX_CPUTIME.