R system.time (exp) çıktısında ölçülen 'kullanıcı' ve 'sistem' süreleri nedir?


92

system.time(expression)Bir R işlevi için yürütme süresini ölçmek için kullanıyorum .

Çağrı için aldığım çıktı

system.time(myfunction())

dır-dir:

    user  system elapsed   
  117.36    5.65  127.86

'Kullanıcı' ve 'sistem' neyi ölçer?



1
Bu soru daha iyi bir başlık kullanabilir - "'kullanıcı' ve 'sistem' zamanları neyi ölçüyor?" Gibi. Bu, listeye göz atan kişiler için soruyu daha net hale getirecektir.
Sharpie

Yanıtlar:


49

Bu, şu bölümde tartışılmaktadır ?proc.time( system.time()bir sınıf nesnesi döndürür "proc.time"):

Details:

     ‘proc.time’ returns five elements for backwards compatibility, but
     its ‘print’ method prints a named vector of length 3.  The first
     two entries are the total user and system CPU times of the current
     R process and any child processes on which it has waited, and the
     third entry is the ‘real’ elapsed time since the process was
     started.

....ve

Value:

....

     The definition of ‘user’ and ‘system’ times is from your OS.
     Typically it is something like

     _The ‘user time’ is the CPU time charged for the execution of user
     instructions of the calling process. The ‘system time’ is the CPU
     time charged for execution by the system on behalf of the calling
     process._

45

Geçen zaman userile systemgeçen zaman arasındaki fark hakkında okuduğum en net açıklama William Dunlap tarafından [R-help] ' de sağlandı :

"Kullanıcı CPU süresi" geçerli işlem tarafından harcanan CPU süresini (yani, geçerli R oturumu) ve "sistem CPU zamanı", geçerli işlem adına çekirdek (işletim sistemi) tarafından harcanan CPU süresini verir. İşletim sistemi, dosyaları açmak, girdi veya çıktı yapmak, diğer işlemleri başlatmak ve sistem saatine bakmak gibi şeyler için kullanılır: birçok işlemin paylaşması gereken kaynakları içeren işlemler.

Her ne kadar ?proc.timedöner benzer bir şey, bu açıklama benim için anlamak çok daha kolay oldu.


24

İşte bazı basit açıklamalar:

Geçen Süre , ifade için CPU'ya / CPU'lara yüklenen zamandır.

Kullanıcı Zamanı , duvar saati süresidir. Bir kullanıcı olarak deneyimlediğiniz zaman.

Genellikle her iki zaman da nispeten yakındır. Ancak diğer bazı durumlarda değişiklik gösterebilir. Örneğin:

  • Eğer geçen süre> kullanıcı zaman , CPU diğer bazı işlemler için etrafında beklediğini bu araçlar (harici olabilir) yapılacak.
  • Eğer geçen süre <kullanıcı zaman , makineniz çoklu çekirdek vardır ve bunları kullanmak mümkün olduğunu bu araçlar

18

Bunlar yine de jenerik olduğundan, Wikipedia'dan:

'Kullanıcı CPU zamanı' terimi ilk başta biraz yanıltıcı olabilir. Açık olmak gerekirse, toplam süre (gerçek CPU süresi), CPU'nun bir program için bazı eylemleri gerçekleştirirken harcadığı zaman miktarı ile CPU'nun program adına çekirdek için sistem çağrıları gerçekleştirerek harcadığı sürenin birleşimidir. Bir program bir dizi aracılığıyla döngü gerçekleştirdiğinde, kullanıcının CPU süresini biriktirir. Tersine, bir program exec veya fork gibi bir sistem çağrısı yürüttüğünde, sistem CPU süresini biriktirir.

http://en.wikipedia.org/wiki/Time_(Unix)#User_Time_vs_System_Time


2

Bu zaman değişkenleri işletim sisteminiz tarafından tanımlandığından, nasıl hesaplandıklarına ilişkin bilgileri man timekabuğunuzda (Unix'te) çalıştırarak alabilirsiniz:

... Bu istatistikler, (i) çağırma ve sonlandırma arasında geçen gerçek zamandan, (ii) kullanıcının CPU zamanından ( (2) tarafından döndürülen bir yapıdaki tms_utimeve tms_cutimedeğerlerinin toplamı ) ve (iii) sistem CPU zamanı ( zaman (2) ile döndürülen bir yapıdaki tms_stimeve tms_cstimedeğerlerinin toplamı ).

Bahsedilen zaman değişkenlerinin tanımı burada bulunabilir :

tms_utime Kullanıcı CPU zamanı.

tms_stime Sistem CPU zamanı.

tms_cutime Sonlandırılan alt işlemlerin kullanıcı CPU süresi.

tms_cstime Sonlandırılan alt işlemlerin sistem CPU süresi.

Kullanıcı ve sistem zamanı arasındaki farkların bir açıklaması daroczig'in cevabında ve SO'da başka yerlerde açıklanmıştır :

tms_utimeEleman kodunuzu yürütme harcanan zaman miktarı veya C kütüphanesinde kodudur. tms_stimeEleman kodu sizin adınıza yürütülmesi çekirdekte harcanan zaman miktarıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.