41

मैं सी में एक छोटा सा प्रोग्राम लिख रहा हूं, और मैं इसे अपने प्रदर्शन को मापना चाहता हूं।सी प्रोग्राम कैश हिट/मिस और सीपीयू समय को लिनक्स में मापने के लिए सबसे सरल उपकरण?

मैं कितना समय यह प्रोसेसर में चलाने के लिए और कितने कैश हिट + चूक है इसे बनाया है देखना चाहता हूँ। संदर्भ स्विच और मेमोरी उपयोग के बारे में जानकारी भी अच्छी होगी।

कार्यक्रम एक दूसरे पर अमल करने से भी कम समय लेता है।

मैं/proc/[pid]/स्टेट की जानकारी चाहते हैं, लेकिन मैं नहीं जानता कि यह कैसे को देखने के लिए के बाद कार्यक्रम की मृत्यु हो गई/मौत हो गई है।

कोई विचार?

संपादित करें: मुझे लगता है कि वालग्रिंड बहुत अधिक ओवरहेड जोड़ता है। यही कारण है कि मैं एक साधारण उपकरण चाहता था, जैसे/proc/[pid]/stat, जो हमेशा वहां होता है।

+0

क्या आप इस तरह कुछ ढूंढ रहे हैं? http://software.intel.com/en-us/articles/intel-performance-counter-monitor/ – harold

उत्तर

66

उपयोग पर्फ़:

perf stat ./yourapp 

जानकारी के लिए kernel wiki perf tutorial देखें। यह आपके सीपीयू के हार्डवेयर प्रदर्शन काउंटर का उपयोग करता है, इसलिए ओवरहेड बहुत छोटा है। विकी है

उदाहरण:

perf stat -B dd if=/dev/zero of=/dev/null count=1000000 

Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000': 

     5,099 cache-misses    #  0.005 M/sec (scaled from 66.58%) 
     235,384 cache-references   #  0.246 M/sec (scaled from 66.56%) 
    9,281,660 branch-misses   #  3.858 %  (scaled from 33.50%) 
    240,609,766 branches     # 251.559 M/sec (scaled from 33.66%) 
1,403,561,257 instructions    #  0.679 IPC (scaled from 50.23%) 
2,066,201,729 cycles     # 2160.227 M/sec (scaled from 66.67%) 
      217 page-faults    #  0.000 M/sec 
      3 CPU-migrations   #  0.000 M/sec 
      83 context-switches   #  0.000 M/sec 
    956.474238 task-clock-msecs   #  0.999 CPUs 

    0.957617512 seconds time elapsed 

एक आधुनिक डेबियन प्रणाली (linux आधार पैकेज के साथ) पर, मैन्युअल रूप से एक कर्नेल मॉड्यूल लोड करने के लिए कोई ज़रूरत नहीं यह सिर्फ काम करना चाहिए। 'Perf record -a'/'perf report' combo के साथ आप पूर्ण-प्रणाली प्रोफाइलिंग भी कर सकते हैं। कोई भी एप्लिकेशन या लाइब्रेरी जिसमें डिबगिंग प्रतीक हैं, रिपोर्ट में विवरण के साथ दिखाई देंगे। विज़ुअलाइज़ेशन flame graphs के लिए अच्छी तरह से काम करने लगते हैं।

7

आपके लिए सबसे अच्छा उपकरण valgrind कहा जाता है। यह मेमोरी प्रोफाइलिंग, कॉल-ग्राफ़ बिल्डिंग और बहुत कुछ करने में सक्षम है।

sudo apt get install valgrind 
valgrind ./yourapp 

हालांकि, समय अपने कार्यक्रम चलाया प्राप्त करने के लिए, आप time(8) linux उपयोगिता का उपयोग कर सकते हैं।

time ./yourapp 
+0

उपाय कैश, या केवल मूल स्मृति को संतुलित कर सकता है? जहां तक ​​मुझे पता है, – jperelli

+1

, वाल्ग्रिंड कम से कम एल 1 और एल 2 सभी कैश स्तरों को माप सकता है। – iehrlich

+3

कैलग्रिंड नामक वालग्रिंड का एक मॉड्यूल है जो कैश को मापता है। –

10

तुम भी

/usr/bin/time -v YourProgram.exe 

यह आप यह सब जानकारी दिखाएगा उपयोग कर सकते हैं:

/usr/bin/time -v ls 
    Command being timed: "ls" 
    User time (seconds): 0.00 
    System time (seconds): 0.00 
    Percent of CPU this job got: 60% 
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00 
    Average shared text size (kbytes): 0 
    Average unshared data size (kbytes): 0 
    Average stack size (kbytes): 0 
    Average total size (kbytes): 0 
    Maximum resident set size (kbytes): 4080 
    Average resident set size (kbytes): 0 
    Major (requiring I/O) page faults: 0 
    Minor (reclaiming a frame) page faults: 314 
    Voluntary context switches: 1 
    Involuntary context switches: 1 
    Swaps: 0 
    File system inputs: 0 
    File system outputs: 0 
    Socket messages sent: 0 
    Socket messages received: 0 
    Signals delivered: 0 
    Page size (bytes): 4096 
    Exit status: 0 

तुम भी -f ध्वज का उपयोग कर सकते अपनी आवश्यकताओं फिट करने के लिए उत्पादन फ़ॉर्मेट करने के लिए।

कृपया, यह पूर्ण पथ का उपयोग कर इस कार्यक्रम कॉल करने के लिए सुनिश्चित हो, otherway यह 'समय' आदेश कॉल करेंगे और है कि तुम क्या जरूरत नहीं है ...

आशा इस मदद करता है!

+7

यह ध्यान रखना उपयोगी है कि '/ usr/bin/time! = Time'। बैश में, 'टाइम' एक अंतर्निहित खोल कीवर्ड है। – jperelli

+9

लेकिन कैश कहां से चूक जाता है? –

+3

उत्तर में कैश मिस के साथ कुछ लेना देना नहीं है। –