2011-06-05 7 views
181

मैं जानना चाहता हूं कि PHP के लिए कितने मिलीसेकंड निष्पादित होते हैं।PHP स्क्रिप्ट्स के निष्पादन समय को मापने के लिए सटीक तरीका

मैं एक सामान्य एल्गोरिथ्म की संरचना पता है, लेकिन पता नहीं कैसे PHP में इसे लागू करने:

Begin 
init1 = timer(); // where timer() is the amount of milliseconds from midnight 
the loop begin 
some code 
the loop end 
total = timer() - init1; 
End 
+0

आप) microtime के swaths (बयानों के साथ बेला के आसपास सकता है, अगर आप उत्पादन में इस की जरूरत है, लेकिन अगर यह सिर्फ परीक्षण के लिए है, बस [xdebug के प्रोफाइलर] का उपयोग करें (http://www.xdebug.org/दस्तावेज़/प्रोफाइलर) उदाहरण के लिए। कोई गन्दा कोड एक वास्तविक प्लस नहीं है। – Wrikken

उत्तर

358

आप इस के लिए microtime फ़ंक्शन का उपयोग कर सकते हैं। the documentation से:

microtime - लौटें माइक्रोसेकंड के साथ वर्तमान यूनिक्स टाइमस्टैम्प get_as_floatTRUE पर सेट है


, तो microtime() एक नाव है, जो यूनिक्स काल करने के लिए सही के बाद से सेकंड में वर्तमान समय का प्रतिनिधित्व करता रिटर्न निकटतम माइक्रोसॉन्ड।

उदाहरण उपयोग:

$start = microtime(true); 
while (...) { 

} 
$time_elapsed_secs = microtime(true) - $start; 
+29

यदि आप वापसी मूल्य के साथ गणना करना चाहते हैं तो आपको 'microtime (true)' की आवश्यकता है। – lonesomeday

+6

मुझे पता है कि यह बहुत देर हो चुकी है (लगभग 4 साल), लेकिन एक टिप्पणी के रूप में ... इन गणनाओं का उपयोग करके (पैरामीटर 'get_as_float'' सत्य 'के रूप में) आपको PHP के अनुसार ** ** ** ** परिणाम देगा प्रलेखन। –

+0

@ AlejandroIván: नहीं, यह नहीं करता है। get_as_float STRING की बजाय फ़्लोट को वापस कर देगा, इसलिए आप रिटर्न वैल्यू के साथ गणना कर सकते हैं ... http://php.net/manual/en/function.microtime.php देखें: अगर get_as_float TRUE पर सेट है, तो microtime() एक फ्लोट देता है, जो यूनिक्स युग निकटतम माइक्रोसॉन्ड के लिए सटीक के बाद से सेकंड में वर्तमान समय का प्रतिनिधित्व करता है। – patrick

17
$start = microtime(true); 
for ($i = 0; $i < 10000; ++$i) { 
    // do something 
} 
$total = microtime(true) - $start; 
echo $total; 
5

आपके पास सही विचार है, microtime() फ़ंक्शन के साथ एक और सटीक समय उपलब्ध है।

यदि लूप के अंदर क्या है तेज़ है, तो यह संभव है कि स्पष्ट समय समाप्त हो जाएगा। यदि ऐसा है, तो कोड के चारों ओर एक और लूप लपेटें और इसे बार-बार कॉल करें। एक बार एक बार प्राप्त करने के लिए पुनरावृत्तियों की संख्या से अंतर को विभाजित करना सुनिश्चित करें। मेरे पास प्रोफाइल कोड है जिसके लिए लगातार, विश्वसनीय समय के परिणाम प्राप्त करने के लिए 10,000,000 पुनरावृत्तियों की आवश्यकता है।

23

अपनी स्क्रिप्ट की शुरुआत में फ़ाइल loadtime.php

<?php 
class loadTime{ 
    private $time_start  = 0; 
    private $time_end  = 0; 
    private $time   = 0; 
    public function __construct(){ 
     $this->time_start= microtime(true); 
    } 
    public function __destruct(){ 
     $this->time_end = microtime(true); 
     $this->time = $this->time_end - $this->time_start; 
     echo "Loaded in $this->time seconds\n"; 
    } 
} 

से बनाएँ, <?php लिखने के बाद include 'loadtime.php'; $loadtime=new loadTime();

जब पेज अंत वहाँ लिखा जाएगा "एक्स सेकंड में लोड किए गए"

में भरी हुई है
+4

साफ! लेकिन यदि आप अपनी वस्तु को स्पष्ट रूप से नष्ट नहीं करते हैं, तो आउटपुट 'टैग के बाद दिखाई देगा जो अमान्य –

+0

@ गोंडो नहीं है, यह सेकेंड होगा (माइक्रोसॉंड के साथ सेस्कंड के दशमलव मान के रूप में व्यक्त किया जाएगा) – FrancescoMM

65

आप निम्नलिखित शिष्टाचार के साथ microtime(true) का उपयोग कर सकते हैं:

इसे अपनी शुरुआत में रखें php फ़ाइल:

//place this before any script you want to calculate time 
$time_start = microtime(true); 

// अपनी स्क्रिप्ट कोड यहाँ जाता है

// do something 

अपने php फ़ाइल के अंत में इस रखो:

// Display Script End time 
$time_end = microtime(true); 

//dividing with 60 will give the execution time in minutes other wise seconds 
$execution_time = ($time_end - $time_start)/60; 

//execution time of the script 
echo '<b>Total Execution Time:</b> '.$execution_time.' Mins'; 

यह उत्पादन आप minutes का परिणाम देगा।

53

PHP 5.4 के बाद से आप $_SERVER["REQUEST_TIME_FLOAT"] का उपयोग कर सकते हैं। इसमें माइक्रोसॉन्ड परिशुद्धता के साथ अनुरोध की शुरुआत का टाइमस्टैम्प होता है।

$time = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"]; 

स्रोत: http://php.net/manual/en/function.microtime.php

यह आपको कोड का केवल एक ही लाइन, उदा स्क्रिप्ट निष्पादन को मापने के लिए अनुमति देता है इसे स्क्रिप्ट के अंत में रखकर।

+0

यह जानना आसान है । तो आप इसका उपयोग कर सकते हैं: '$ start = $ _SERVER [" REQUEST_TIME_FLOAT "]; $ myscript = microtime (सत्य); $ बूटस्ट्रैप = ​​$ माइस्क्रिप्ट - $ शुरू; ...कार्य करना ...; $ myscripttime = microtime (true) - $ myscript; ' – pspahn

+1

इसका उपयोग करने के बारे में पूरी बात यह है कि आप बस ऐसा कर सकते हैं:' $ myscripttime = microtime (true) - $ _SERVER ["REQUEST_TIME_FLOAT"]; 'आपके अंत में शुरुआत में एक टाइमस्टैम्प को बचाने के बिना स्क्रिप्ट। – Iwazaru

+1

लिंक किए गए दस्तावेज़ों के अनुसार, '$ time' में _seconds_ में अंतर होगा, _microseconds_ में नहीं। –

7

यहाँ एक समारोह है कि PHP कोड के किसी भी भाग के समय निष्पादन, ज्यादा अजगर की तरह के timeit मॉड्यूल करता है: https://gist.github.com/flaviovs/35aab0e85852e548a60a

इसका उपयोग कैसे करें:

include('timeit.php'); 
const SOME_CODE = ' 
     strlen("foo bar"); 
'; 
$t = timeit(SOME_CODE); 
print "$t[0] loops; $t[2] per loop\n"; 

परिणाम:

$ php x.php 
100000 loops; 18.08us per loop 

अस्वीकरण: मैं इस गिस्ट के लेखक हूं

संपादित करें: समय यह अब https://github.com/flaviovs/timeit

0

पर एक अलग, आत्म निहित परियोजना है यहाँ बहुत ही सरल है एक कार्यान्वयन कि आंशिक सेकंड देता है और कम विधि

<?php 
$time_start = microtime(true); 
//the loop begin 
//some code 
//the loop end 
$time_end = microtime(true); 
$total_time = $time_end - $time_start; 
echo $total_time; // or whatever u want to do with the time 
?> 
1

यहाँ (अर्थात 1.321 सेकंड)

/** 
* MICROSECOND STOPWATCH FOR PHP 
* 
* Class FnxStopwatch 
*/ 
class FnxStopwatch 
{ 
    /** @var float */ 
    private $start, 
      $stop; 

    public function start() 
    { 
     $this->start = self::microtime_float(); 
    } 
    public function stop() 
    { 
     $this->stop = self::microtime_float(); 
    } 
    public function getIntervalSeconds() : float 
    { 
     // NOT STARTED 
     if (empty($this->start)) 
      return 0; 
     // NOT STOPPED 
     if (empty($this->stop)) 
      return ($this->stop - self::microtime_float()); 

     return $interval = $this->stop - $this->start; 
    } 

    /** 
    * FOR MORE INFO SEE http://us.php.net/microtime 
    * 
    * @return float 
    */ 
    private static function microtime_float() : float 
    { 
     list($usec, $sec) = explode(" ", microtime()); 

     return ((float)$usec + (float)$sec); 
    } 
} 
संबंधित मुद्दे