Mengapa waktu nyata bisa lebih rendah dari waktu pengguna

31

Saya memiliki skrip yang mengkonversi file video dan saya menjalankannya di server pada data uji dan mengukur waktunya time. Hasilnya saya melihat:

real    2m48.326s
user    6m57.498s
sys     0m3.120s

Mengapa waktu sebenarnya jauh lebih rendah daripada waktu pengguna? Apakah ini ada hubungannya dengan multithreading? Atau apa lagi?

Sunting: Dan saya pikir skrip itu berjalan sekitar 2m48s

kobylecki
sumber
ulang EDIT Anda - itu masuk akal, karena realwaktu adalah jam dinding seperti yang dijelaskan di bawah ini (yaitu apa yang akan kami ukur jika kami memiliki stop-watch)
Levon
Terkait: stackoverflow.com/questions/15928334/…
coba-tangkap-akhirnya

Jawaban:

42

Output yang Anda tunjukkan agak aneh, karena real time biasanya akan lebih besar daripada dua lainnya.

  • Realwaktu adalah jam dinding. (apa yang bisa kita ukur dengan stopwatch)
  • User waktu adalah jumlah waktu yang dihabiskan dalam mode pengguna dalam proses
  • Sys adalah waktu CPU yang dihabiskan di kernel dalam proses.

Jadi saya kira jika pekerjaan itu dilakukan oleh beberapa prosesor secara bersamaan, waktu CPU akan lebih tinggi daripada waktu jam dinding yang berlalu.

Apakah ini jenis aplikasi bersamaan / multi-utas / paralel?

Sama seperti contoh, ini yang saya dapatkan di sistem Linux saya ketika saya mengeluarkan time find .perintah. Seperti yang diharapkan, realwaktu yang telah berlalu jauh lebih besar daripada yang lain pada proses pengguna tunggal / inti tunggal ini.

real    0m5.231s
user    0m0.072s
sys     0m0.088s

Aturan praktisnya adalah:

  • real <user: Prosesnya adalah terikat CPU dan mengambil keuntungan dari eksekusi paralel pada banyak core / CPU.
  • pengguna nyata: Proses ini terikat CPU dan tidak mengambil keuntungan dari pelepasan paralel.
  • real> user: Prosesnya terikat I / O. Eksekusi pada banyak core akan sedikit atau tidak menguntungkan.
Levon
sumber
Saya tidak tahu apakah avconvmulti-threaded. Mungkin itu. avconvadalah generasi baru ffmpeg. Saya mengonversi 7 file flv pendek (masing-masing sekitar 20 detik).
kobylecki
waktu nyata biasanya akan lebih besar daripada dua lainnya - tapi saya bertanya tentang situasi lain
kobylecki
4
Penjelasan ini benar. Sepertinya proses ini dijalankan pada 4 core. Lihat juga penjelasan saya tentang hyperthreading untuk informasi lebih lanjut tentang bagaimana real / sys / waktu pengguna dihitung. Itu tidak berhubungan persis, tetapi konsepnya sama.
bahamat
@kobylecki waktu nyata kurang dari yang lain karena sepertinya avconv dijalankan pada banyak core. Karena saya tidak tahu perangkat lunak itu, atau bagaimana perangkat itu dijalankan, saya tidak ingin membuat klaim 100%, tetapi ini terlihat seperti berdasarkan pada informasi yang tersedia (3 baris pengukuran waktu, dan pengetahuan: - )
Levon
Dalam findcontoh usrnilai jauh lebih rendah karena sebagian besar waktu telah dihabiskan selama interupsi, bahkan jika findakan multithreaded itu akan tetap rendah (maaf jika saya tidak menguasai tenses bahasa Inggris).
Emmanuel
13

Hanya untuk menggambarkan apa yang telah dikatakan, dengan dua proses ulir melakukan perhitungan.

/*a.c/*
    #include <pthread.h>
    static void  * dosomething () {
        unsigned long a,b=1;
        for (a=1000000000; a>0; a--) b*=3;
        return NULL;
    }
    main () {
        pthread_t one, two;
        pthread_create(&one,NULL, dosomething, NULL);
        pthread_create(&two,NULL, dosomething, NULL);
        pthread_join (one, NULL);
        pthread_join (two, NULL);
    }
/* end of a.c */

menyusun

gcc a.c -lpthread

(Ini hanya sebagai ilustrasi, dalam kehidupan nyata saya seharusnya menambahkan flag -D_REENTRANT)

$ time ./a.out

real    0m7.415s
user    0m13.105s
sys     0m0.032s

(Waktu pada Intel Atom yang memiliki dua core lambat :))

Emmanuel
sumber