2015-01-09 8 views
5

मैं time.clock और time.time का उपयोग कर Ubuntu पर अजगर कोड का एक वर्ग का समय समाप्त हो:समय के मुकाबले ज्यादा समय बीतने का समय क्यों है। समय?

clock elapsed time: 8.770 s 
time elapsed time: 1.869 s 

मैं समझता हूँ कि time.time प्रणाली समय का उपयोग करता है और time.clock प्रोसेसर घड़ी का उपयोग करता। यह मुझे समझ में आता है जब समय। समय समय के मुकाबले एक बड़ा समय बीतता है। घड़ी: प्रोसेसर पूरे समय सक्रिय नहीं था (उदाहरण के लिए time.sleep पर कॉल करें)।

लेकिन क्यों प्रोसेसर घड़ी एक विलुप्त समय देगी, सिस्टम 0 की तुलना में अधिक है?


परिशिष्ट

मैं एक मोटा परीक्षण कंप्यूटिंग एक मानक नक्शे के साथ एक ही समारोह, एक प्रक्रिया पूल नक्शे के साथ, और एक थ्रेड पूल नक्शा किया था। समझा जा सकता है, प्रक्रिया पूल तेज है और धागा पूल धीमा है। अधिक दिलचस्प बात: घड़ी समय कम प्रोसेसर पूल के साथ समय के समय की तुलना में अधिक थ्रेड पूल में है।

फिर से, मैं समझता हूं कि प्रोसेसर पूल के साथ घड़ी का समय क्यों कम है: संभवतः मास्टर प्रक्रिया बहुत कुछ नहीं करती है और पूल प्रक्रियाओं को पूरा करने की प्रतीक्षा करती है। लेकिन थ्रेड पूल के साथ घड़ी का समय क्यों अधिक है? कोई अंतर्दृष्टि?

परिणाम:

map 
    time 1738.8 
    clock 1739.6 
mp pool 
    time 580.1 
    clock 15.9 
thread pool 
    time 3455.3 
    clock 5378.9 

कोड:

from time import clock, sleep, time 
from multiprocessing.pool import ThreadPool 
from multiprocessing import Pool 
import random 

def f(i): 
    x = [random.random() for j in range(100000)] 
    return x[i] 

def t(fn): 
    t0, c0 = time(), clock() 
    for i in range(10): fn(f,range(16)) 
    print ' time ', round(1000*(time()-t0),1) 
    print ' clock', round(1000*(clock()-c0),1) 

if __name__ == '__main__': 
    print 'map' 
    t(map) 

    pool = Pool(8) 
    print 'mp pool' 
    t(pool.map) 

    pool = ThreadPool(8) 
    print 'thread pool' 
    t(pool.map) 
+0

कुछ समांतर? क्या आप 8 कोर पर चल रहे हैं? – dmg

+0

हां, यह मेरा संदेह भी है। तो क्या घड़ी सभी प्रोसेसर के लिए एक विलम्बित घड़ी का समय देती है? – jmilloy

+0

ओएस-विशिष्ट हो सकता है, लेकिन मैंने कई समय के उपकरण/libs – dmg

उत्तर

2

CPU समय दीवार समय से अधिक हो सकती है अगर आप एक से अधिक CPU पर निष्पादित। मैंने इसे विशेष रूप से पायथन में नहीं देखा है, लेकिन मैंने clock फ़ंक्शन का उपयोग करके सी से कई धागे के साथ यह निश्चित रूप से देखा है, और शायद पाइथन कोड सीधे इस सी फ़ंक्शन को कॉल कर रहा है।

"क्यों" के बारे में: आप इसके बारे में गलत तरीके से सोच रहे हैं। क्या महत्वपूर्ण है कोर आपके प्रोग्राम को चला रहे हैं। यदि एक कोर दीवार के दो सेकंड के दौरान एक सेकंड के लिए चलता है जो आपको समझ में आता है, लेकिन क्या होगा यदि चार कोर प्रत्येक एक ही समय अंतराल पर एक सेकंड के लिए दौड़ते हैं। फिर आपके पास दीवार के 2 सेकंड में 4 सेकंड का CPU समय होता है। कर्नेल सभी कोरों को मापने के लिए CPU समय के लिए खाता है। यदि एक ही सेकंड के दौरान एकाधिक कोर चलते हैं तो आपने उस सेकंड के दौरान कई CPU सेकंड बिताए। यह लागत माप है जो शेड्यूलर के लिए महत्वपूर्ण है, और संभवतः वह मेट्रिक है जो clock पर बनाया गया है। यह उस मेट्रिक नहीं हो सकता है जिसकी आप परवाह करते हैं, लेकिन इस तरह यह काम करता है।

+0

अनुभवजन्य, यह मामला प्रतीत होता है। क्यूं कर? – jmilloy

+0

['std :: clock'] के लिए प्रलेखन (http://en.cppreference.com/w/cpp/chrono/c/clock) बस इसे एक तथ्य के रूप में बताता है। – b4hand

+0

मैं यह जानने का प्रयास कर रहा हूं कि क्यों। प्रोसेसर घड़ी मापने क्या है? ऐसा लगता है कि प्रोसेसर सक्रिय होने की मात्रा को मापने के लिए प्रतीत होता है, लेकिन यह पूरी तरह से सटीक नहीं हो सकता है क्योंकि प्रोसेसर वास्तव में पारित होने की तुलना में अधिक समय तक सक्रिय नहीं हो सकता है (या यह हो सकता है कि जिस तरह से बहु थ्रेडिंग काम करता है हार्डवेयर स्तर?) आपके द्वारा प्रदान किया गया उत्तर मेरे अनुभव की पुष्टि करता है और बताता है कि यह दस्तावेज है (यानी एक बग नहीं)। लेकिन यह क्यों नहीं समझाता है। – jmilloy

संबंधित मुद्दे