Küsimus:
Ajastusfunktsioonid R-s
Tim
2010-10-01 16:46:10 UTC
view on stackexchange narkive permalink
  1. Tahaksin mõõta funktsiooni käitamise kordamiseks kuluvat aega. Kas replicate () ja for-loopsi kasutamine on samaväärsed? Näiteks:

      system.time (replicate (1000, f ())); system.time (for (i in 1: 1000) {f ()});  

    Milline on eelistatud meetod.

  2. Väljundis system.time () on sys + kasutaja tegelik protsessori aeg programmi käivitamiseks? Kas möödunud on hea aja tulemuslikkuse näitaja?

Lihtsalt rekordiks, kuna olen selgelt liiga hilja selle küsimuse käiku muutma: see on minu arvates kõige sobivam StackOverflow jaoks.
@Matt Olen nõus, et küsimused selle kohta, kuidas üks kord programm SO-le hästi sobib.Olen nõus ka sellega, et selle küsimuse sõnasõnaline tõlgendamine (nagu seda on mitmed vastused võtnud) asetaks selle CV-le teemaväliseks.Tundub siiski, et teatav statistiline huvi on * ajastuskatse kavandamise ja sellise katse tulemuste * analüüsimise vastu.
Viis vastused:
#1
+25
Dirk Eddelbuettel
2010-10-01 17:03:12 UTC
view on stackexchange narkive permalink

Mis puutub teie kahte punkti:

  1. see on stiililine. Mulle meeldib replicate () , kuna see on funktsionaalne.
  2. Kipun keskenduma möödunud ehk kolmandale numbrile.
  3. ol >

    Mida ma sageli teen, on

      N <- someNumbermean (kordus (N, süsteem.aeg (f (...)) [3], kärbitud = 0,05))  kood> 

    , et saada 90% N-i korduse kärbitud keskmisest f().

    (Redigeeritud, tänud Hadleyle thinko.)

Kas te ei mõtle seda: mean (replicate (N, system.time (f (...)) [3]), trim = 0.05)?
Kui f () kõne on pikk, on see korras. Kui aga f () kõne on lühike, suurendab tõenäoliselt iga ajakõne üldkulude tõrke mõõtmist. Ühe süsteemihalduse system.time () väljakutsega f () paljude korduste korral jagatakse kõne tõrge seni, kuni see on mingi lõpmatu väike väärtus (ja see naaseb kiiremini).
@John: Aitäh, aga ma ei saa päris hästi aru, mida te ütlesite. Ma ikka mõtlen, kumb on parem, korrates f () süsteemis või väljaspool süsteemi. Aeg ()?
Igal käsul system.time () tehtud kutsumisel on helistamiseks kuluv muutuv aeg, mis põhjustab teatud mõõtevea. See on väike summa. Aga mis siis, kui f () on väga lühike kõne? Siis saab selle vea segi ajaga, mis kulub f () helistamiseks. Niisiis, kui helistate f () 1e5 korda ühe süsteemi sees. Time () kõne, jagatakse viga 1e5 tükkideks. Kui helistate system.time () iga f () jaoks, võib selle mõju olla tähendusrikas, kui f () jaoks aeg on väike. Muidugi, kui teil on vaja ainult suhtelist ajastust, pole sellel suurt tähtsust.
Oh, ja teine ​​osa on see, et oleks kiirem helistada süsteemile.call () üks kord.
#2
+19
whuber
2010-10-01 22:08:15 UTC
view on stackexchange narkive permalink

Programmide tõhusaks ajastamiseks, eriti kui olete huvitatud alternatiivsete lahenduste võrdlemisest, vajate juhtimist! Hea viis on panna ajastatav protseduur funktsiooni. Funktsiooni kutsumine ajastuspiirkonnas. Kirjutage pisteprotseduur, sisuliselt eemaldades funktsioonist kogu koodi ja naastes sellest lihtsalt (kuid jätke kõik argumendid sisse). Pange pistik ajavõtusilmusse ja ajage uuesti. See mõõdab kogu ajastusega seotud üldkulusid. Võrgu saamiseks lahutage protseduuriajast torkeaeg: see peaks olema tegeliku vajaliku aja täpne mõõt.

Kuna enamikku süsteeme saab tänapäeval lubamatult katkestada, on oluline teha mitu ajastuskäiku kontrollige varieeruvust. Selle asemel, et teha üks $ N $ sekundi pikkune jooks, tehke igaüks umbes $ N $ / m $ sekundit. See aitab seda teha topelt-silmusena kõik ühe korraga. Lisaks sellele, et seda on kergem käsitseda, lisab see igas aegridas natuke negatiivset korrelatsiooni, mis parandab hinnanguid.

Kasutades neid eksperimentaalse disaini põhiprintsiipe, kontrollite sisuliselt kõiki võimalikke erinevusi. koodi juurutamise kohta (nt vahe for loop ja replicate () vahel). See muudab teie probleemi kaduma.

#3
+10
user88
2010-10-01 18:30:55 UTC
view on stackexchange narkive permalink

Võite aega veeta ka ajakava järgi, mille tagastab Sys.time ; see muidugi mõõdab seinaaega, seega reaalajas arvutamise aega. Koodinäide:

  Sys.time () - >start; replicate (N, doMeasuredComputation ()); print (Sys.time () - start);  
#4
+3
Tal Galili
2010-10-02 01:51:11 UTC
view on stackexchange narkive permalink

Mis ajastamismõõdikut kasutada, ei saa ma teistele vastajatele lisada.

Mis puutub kasutatavasse funktsiooni, siis mulle meeldib kasutada rbenchmark-paketi etaloni.

#5
+1
John
2010-10-01 20:48:31 UTC
view on stackexchange narkive permalink

Nad teevad erinevaid asju. Aeg, mida soovite teha. replicate () tagastab funktsiooni iga täitmise tulemuste vektori. For loop ei tee seda. Seetõttu pole need samaväärsed väited.

Lisaks ajastage mitu korda, kuidas soovite midagi teha. Siis leiate kõige tõhusama meetodi.

mod-tip: postitage teine ​​osa kommentaarina Dirki vastusele.


See küsimus ja vastus tõlgiti automaatselt inglise keelest.Algne sisu on saadaval stackexchange-is, mida täname cc by-sa 2.0-litsentsi eest, mille all seda levitatakse.
Loading...