PHP स्क्रिप्ट की बेंचमार्क दक्षता कैसे करें


131

मैं जानना चाहता हूं कि मेरी PHP स्क्रिप्ट्स को बेंचमार्क करने का सबसे अच्छा तरीका क्या है। इससे कोई फर्क नहीं पड़ता कि कोई क्रॉन जॉब, या वेबपेज या वेब सर्विस।

मुझे पता है कि मैं माइक्रोटाइम का उपयोग कर सकता हूं लेकिन क्या यह वास्तव में मुझे PHP स्क्रिप्ट का वास्तविक समय दे रहा है?

मैं PHP में विभिन्न कार्यों का परीक्षण और बेंचमार्क करना चाहता हूं जो एक ही काम करते हैं। उदाहरण के लिए, preg_matchvs strposया domdocumentvs preg_matchया preg_replace vs str_replace`

एक वेबपेज का उदाहरण:

<?php
// login.php

$start_time = microtime(TRUE);

session_start(); 
// do all my logic etc...

$end_time = microtime(TRUE);

echo $end_time - $start_time;

यह आउटपुट होगा: 0.0146126717 (हर समय बदलता रहता है - लेकिन यही एक आखिरी है जो मुझे मिला)। इसका मतलब यह है कि PHP स्क्रिप्ट को निष्पादित करने के लिए 0.015 या ऐसा लगता है।

क्या कोई बेहतर तरीका है?


यह लेख पढ़ें: rakesh.sankar-b.com/2011/01/12/echo-print-which-is-fast-php - मुझे आशा है कि यह मदद करता है।
राकेश शंकर

4
0.015 सेकंड। एक आँख की औसत निमिष गति 0.3 सेकंड है। क्या आपको वास्तव में, वास्तव में, वास्तव में उस गति में सुधार करने की आवश्यकता है, क्या मैं पूछ सकता हूं कि क्यों?
बेन

4
@ben एक उदाहरण है, मेरे पास पृष्ठ हैं जो 0.8 सेकंड में 50k से अधिक आगंतुकों के साथ लोड करता है एक घंटे में मुझे यह सुनिश्चित करने की आवश्यकता है कि पेज लोड तेजी से
एरिक

8
@MarcB अमेज़ॅन ने स्पष्ट रूप से परीक्षण किया और पाया कि 100ms देरी से बिक्री में 1% की गिरावट हुई। जो कि अमेजन जैसी बड़ी साइट के लिए अरबों का हो सकता है। highscalability.com/...
ceejayoz

1
@ceejayoz हाँ, अगर आप amazon हैं तो यह एक बड़ी समस्या है, लेकिन अगर आपका नहीं तो इसके लिए सिर्फ पागल पृष्ठ लोडिंग समय का पीछा करने से सावधान रहें। अमेज़ॅन ने अपना होमवर्क किया और इसलिए बिक्री में वाई ड्रॉप-ऑफ को पुनः प्राप्त करने के लिए आसानी से एक्स घंटे की राशि खर्च करने का औचित्य साबित कर सकता है। यहाँ सबक अपना खुद का होमवर्क है!
जेम्स बटलर

जवाबों:


123

यदि आप वास्तव में वास्तविक विश्व कोड को बेंचमार्क करना चाहते हैं, तो Xdebug और XHProf जैसे टूल का उपयोग करें ।

जब आप देव / मंचन में काम कर रहे हों तो Xebebug बहुत अच्छा है, और XHProf उत्पादन के लिए एक बढ़िया साधन है और इसे वहां चलाना सुरक्षित है (जब तक आप निर्देश पढ़ते हैं)। किसी भी एक पृष्ठ लोड के परिणाम उतने प्रासंगिक नहीं होंगे जितना यह देखने के लिए कि आपका कोड कैसे कार्य करता है, जबकि सर्वर को एक लाख अन्य काम करने के लिए तैयार किया जा रहा है और साथ ही संसाधन दुर्लभ हो जाते हैं। यह एक और सवाल उठाता है: क्या आप CPU पर अड़चन डाल रहे हैं? राम? मैं / हे?

आपको अपनी स्क्रिप्ट्स में केवल उसी कोड को देखना होगा जो आप अपनी स्क्रिप्ट्स / पेज पर काम कर रहे हैं। आप किस वेब सर्वर का उपयोग कर रहे हैं? एक उदाहरण के रूप में, मैं nginx + PHP-FPM को गंभीरता से mod_php + Apache कर सकता हूं, जो बदले में एक अच्छी CDN का उपयोग करके स्थिर सामग्री परोसने के लिए ट्रेंड करता है।

अगली बात पर विचार करना है कि आप किसके लिए अनुकूलन करने की कोशिश कर रहे हैं?

  • क्या वह गति जिसके साथ पृष्ठ उपयोगकर्ताओं को ब्राउज़र में नंबर एक प्राथमिकता देता है?
  • क्या लक्ष्य को कम से कम सीपीयू की खपत के साथ जितनी जल्दी हो सके फेंक दिया गया है?

पूर्व में ब्राउज़र को भेजे गए सभी संसाधनों को जिप करने जैसी चीजों से मदद की जा सकती है, फिर भी ऐसा करने से (कुछ परिस्थितियों में) आपको बाद वाले को प्राप्त करने से दूर धकेल देगा।

उम्मीद है कि उपरोक्त सभी यह दिखाने में मदद कर सकते हैं कि सावधानीपूर्वक पृथक 'लैब' परीक्षण उन चरों और समस्याओं को प्रतिबिंबित नहीं करेगा जो आपके उत्पादन में आएँगी, और आपको यह पहचानना होगा कि आपका उच्च स्तर का लक्ष्य क्या है और फिर वहाँ पहुँचने के लिए आप क्या कर सकते हैं, माइक्रो / प्रीमेच्योर-ऑप्टिमाइज़ेशन रूट टू हेल से नीचे जाने से पहले ।


6
यदि यह वास्तव में आपके प्रश्न का उत्तर देता है, तो मुझे लगता है कि आपके प्रश्नों को गलत तरीके से लिखा गया था (या शायद मैं इसे गलत पढ़ता हूं)। अपने प्रश्न के आधार पर, यह लग रहा था कि आप PHP में एक ही काम करने के विभिन्न तरीकों को अलग करना चाहते हैं और यह पहचानना चाहते हैं कि कौन सा सबसे तेज़ है। हालाँकि, आपके द्वारा स्वीकार किए गए उत्तर और इनाम दिए जाने के आधार पर, ऐसा लगता है कि आप पूरे वेब स्टैक का लोड परीक्षण करने में अधिक रुचि रखते हैं - जो कि पूरी तरह से कुछ अलग है।
एलेक गॉर्ज

Xdebug Ioncube एन्कोडेड स्क्रिप्ट का समर्थन नहीं करता है। आप उन स्क्रिप्ट को कैसे करते हैं?
बिगसैक

@BigSack तुम अपने आप पर दयालु हो, मैंने कभी भी ऐसा कुछ भी करने की कोशिश नहीं की है जो इस तरह से बाधित हो। मैं XHProf के साथ पहली बार एक शॉट के रूप में होगा अपेक्षाकृत आसान चलाने के लिए आसान है। आप पा सकते हैं कि IonCube पूरी तरह से किसी भी गैर उपयोगकर्ता प्रोफाइल प्रोफाइलर के साथ हस्तक्षेप करता है।
जेम्स बटलर

1
Nginx बनाम Apache स्टेटमेंट थोड़ा पक्षपाती है। सबसे अधिक उपेक्षा के AllowOverideकारण अपाचे हर अनुरोध पर .htaccess फ़ाइलों के लिए पूरी निर्देशिकाओं को पार कर जाता है। यह अकेले अपाचे को अपने रास्ते से हटा देता है।
B00MER

74

यह मानने के लिए कि आपकी पूरी स्क्रिप्ट सर्वर पर कितनी तेजी से चलती है, ऐसे बहुत सारे उपकरण हैं जिनका आप उपयोग कर सकते हैं। पहले यह सुनिश्चित कर लें कि आपकी स्क्रिप्ट (उदाहरण के लिए preg_match बनाम स्ट्रैप) को आपकी परीक्षा उत्तीर्ण करने के लिए समान परिणाम आउटपुट करने हैं।

आप उपयोग कर सकते हैं:


30

आप Xdebug और विशेष रूप से, Xdebug की प्रोफाइलिंग क्षमताओं को देखना चाहेंगे

मूल रूप से, आप प्रोफाइलर को सक्षम करते हैं, और हर बार जब आप किसी वेबपेज को लोड करते हैं तो यह एक कैशग्राइंड फ़ाइल बनाता है जिसे WinCacheGrind या KCacheGrind के साथ पढ़ा जा सकता है

Xdebug को कॉन्फ़िगर करने के लिए थोड़ा मुश्किल हो सकता है इसलिए यहाँ php.iniसंदर्भ के लिए मेरे संबंधित अनुभाग है :

[XDebug]
zend_extension = h:\xampp\php\ext\php_xdebug-2.1.1-5.3-vc6.dll
xdebug.remote_enable=true
xdebug.profiler_enable_trigger=1
xdebug.profiler_output_dir=h:\xampp\cachegrind
xdebug.profiler_output_name=callgrind.%t_%R.out

और यहाँ WinCacheGrind.out में एक फ़ाइल का एक स्क्रीनशॉट है :

यहाँ छवि विवरण दर्ज करें

यह आपके PHP स्क्रिप्ट को कितना प्रभावशाली बनाता है, इसके बारे में पर्याप्त विवरण प्रदान करना चाहिए। आप उन चीजों को लक्षित करना चाहते हैं जो सबसे अधिक समय लेते हैं। उदाहरण के लिए, आप समय की आधी राशि लेने के लिए एक फ़ंक्शन का अनुकूलन कर सकते हैं, लेकिन आपके प्रयासों को एक फ़ंक्शन को अनुकूलित करना बेहतर होगा जो एक पेज लोड के दौरान सैकड़ों बार नहीं तो दर्जनों कहा जाता है।

यदि आप उत्सुक हैं, तो यह सीएमएस का एक पुराना संस्करण है जिसे मैंने अपने स्वयं के उपयोग के लिए लिखा था।


8
बहुत जटिल लगता है, मैं एक बात समझ में नहीं आता
eric

आप किस हिस्से को नहीं समझते हैं? सेटअप या डेटा का विश्लेषण?
एलेक गॉर्ज

1
अच्छी तरह से सेटअप नं, जो मेरे सर्वर पर काम नहीं करेगा, लेकिन डेटा, इसके सभी छोटे बक्से जिन्हें मैं नहीं पढ़ सकता हूं
eric

13
क्योंकि मैं विंडोज़ का उपयोग नहीं करता
eric

2
XDebug + KCacheGrind के लिए +1। यह वास्तव में सहायक और आश्चर्यजनक रूप से स्थापित करने और उपयोग करने में आसान है। मैं काफी समय से इसका उपयोग कर रहा हूं, एक अतिरिक्त बोनस जो आपको मिलता है - एक आप इसके साथ पारिवारिक हो जाते हैं, आप केचैचग्रिंड का उपयोग वैल्ग्रिंड (+ मेमग्रिंड / कॉलग्रिंड) के साथ कई अन्य भाषाओं (और न केवल सीपीयू समय) को प्रोफाइल करने के लिए कर सकते हैं।
XzKto 7

16

Https://github.com/fotuzlab/appgati को आज़माएं

यह दो चरणों के बीच कोड और रिपोर्ट समय, मेमोरी उपयोग, सर्वर लोड आदि में चरणों को परिभाषित करने की अनुमति देता है।

कुछ इस तरह:

    $appgati->Step('1');

    // Do some code ...

    $appgati->Step('2');

    $report = $appgati->Report('1', '2');
    print_r($report);

नमूना उत्पादन सरणी:

Array
(
    [Clock time in seconds] => 1.9502429962158
    [Time taken in User Mode in seconds] => 0.632039
    [Time taken in System Mode in seconds] => 0.024001
    [Total time taken in Kernel in seconds] => 0.65604
    [Memory limit in MB] => 128
    [Memory usage in MB] => 18.237907409668
    [Peak memory usage in MB] => 19.579357147217
    [Average server load in last minute] => 0.47
    [Maximum resident shared size in KB] => 44900
    [Integral shared memory size] => 0
    [Integral unshared data size] => 0
    [Integral unshared stack size] => 
    [Number of page reclaims] => 12102
    [Number of page faults] => 6
    [Number of block input operations] => 192
    [Number of block output operations] => 
    [Number of messages sent] => 0
    [Number of messages received] => 0
    [Number of signals received] => 0
    [Number of voluntary context switches] => 606
    [Number of involuntary context switches] => 99
)

2
लवली इंटरफ़ेस डिजाइन (जैसा कि मैं देख रहा हूँ आप लेखक हैं), grats! (और "ProperCase" का उपयोग करने के लिए धन्यवाद;) SetMemory()बदसूरत लेकिन अभी भी सर्वव्यापी mixedCase()बकवास के बजाय विधि नाम (जैसे ) , जो कि PHP में वैसे भी व्यावहारिक रूप से व्यर्थ है। तुम शायद बहुत बूढ़े हो। ;))
एसजे।

1
पूरी तरह से पुराना है, लेकिन कुछ मिनटों के साथ मैंने इसे कुछ अच्छे और उपयोगी (यहां तक ​​कि खिड़कियों में) बदल दिया। मैं यह देखने की कोशिश करूंगा कि क्या मैं एक पुल अनुरोध कर सकता हूं।
टॉमस गोंजालेज

7

मैं xhprof में देखूंगा । इससे कोई फर्क नहीं पड़ता कि यह cli पर या किसी अन्य sapi (जैसे fpm या fcgi या यहाँ तक कि Apache मॉड्यूल) के माध्यम से चलाया जाता है।

Xhprof के बारे में सबसे अच्छी बात यह है कि यह उत्पादन में चलाने के लिए पर्याप्त रूप से फिट है। कुछ ऐसा जो xdebug के साथ काम नहीं करता (पिछली बार जब मैंने जाँच की थी)। xdebug का प्रदर्शन और xhprof पर प्रभाव पड़ता है (मैं नहीं कहूंगा कि कोई भी नहीं है) बहुत बेहतर प्रबंधन करता है।

हम अक्सर वास्तविक ट्रैफ़िक के साथ नमूने एकत्र करने के लिए xhprof का उपयोग करते हैं और फिर वहां से कोड का विश्लेषण करते हैं।

यह वास्तव में एक बेंचमार्क नहीं है कि यह आपको समय देता है और यह सब, हालांकि यह ऐसा ही करता है। यह सिर्फ उत्पादन ट्रैफ़िक का विश्लेषण करने और फिर एकत्र किए गए कॉलगर्ल में php फ़ंक्शन स्तर तक ड्रिल करने के लिए बहुत आसान बनाता है।

एक बार जब एक्सटेंशन संकलित हो जाता है और लोड हो जाता है तो आप कोड में प्रोफाइलिंग शुरू कर देते हैं:

xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

रोकने के लिए:

$xhprof_data = xhprof_disable();

फिर डेटा को किसी फ़ाइल, या डेटाबेस में सहेजें - जो भी आपके बोट को फ्लोट करता है और सामान्य रनटाइम को बाधित नहीं करता है। हम एसिंक्रोनस रूप से डेटा को केंद्रीकृत करने के लिए इसे S3 पर धक्का देते हैं (हमारे सभी सर्वरों से सभी रन देखने में सक्षम होने के लिए)।

GitHub पर कोड है जो आप सर्वर पर और न्यूनतम विन्यास के साथ डंप एक xhprof_html फ़ोल्डर में शामिल है, तो आप डेटा एकत्र कल्पना और नीचे ड्रिलिंग शुरू कर सकते हैं।

HTH!


3

forअधिक यथार्थवादी संख्या प्राप्त करने के लिए प्रत्येक चीज़ को 1,000,000 बार करने के लिए इसे एक लूप में रखें । और केवल टाइमर को उस कोड से ठीक पहले शुरू करें, जिसे आप वास्तव में बेंचमार्क करना चाहते हैं, फिर अंत समय को रिकॉर्ड करें (यानी इससे पहले टाइमर शुरू न करें session_start()

यह भी सुनिश्चित करें कि प्रत्येक फ़ंक्शन के लिए कोड समान है जिसे आप बेंचमार्क करना चाहते हैं, फ़ंक्शन के अपवाद के साथ आप टाइमिंग कर रहे हैं।

स्क्रिप्ट को कैसे निष्पादित किया जाता है (क्रोनजॉब, कमांडलाइन, एपाचे, आदि से php) को फर्क नहीं करना चाहिए क्योंकि आप केवल विभिन्न कार्यों की गति के बीच सापेक्ष अंतर का समय निर्धारित कर रहे हैं। इसलिए यह अनुपात समान रहना चाहिए।

यदि आप जिस कंप्यूटर पर बेंचमार्क चला रहे हैं, उसमें कई अन्य चीजें चल रही हैं, तो यह बेंचमार्क परिणामों को प्रभावित कर सकता है यदि सीपीयू में स्पाइक हो या किसी अन्य एप्लिकेशन से मेमोरी उपयोग हो, जबकि आपका बेंचमार्क चल रहा हो। लेकिन जब तक आपके पास कंप्यूटर पर बहुत सारे संसाधन हैं तब तक मुझे नहीं लगता कि यह कोई समस्या होगी।


1

एक अच्छी शुरुआत xdebugs प्रोफाइलर का उपयोग कर रही है http://xdebug.org/docs/profiler

शायद स्थापित करने और उपयोग करने के लिए सबसे आसान चीज नहीं है, लेकिन एक बार जब आप इसे डेटा के विशाल मात्रा में जा रहे हैं और देखने में आसानी होती है, तो यह अप्राप्य है।


0

एरिक,

आप खुद से गलत सवाल पूछ रहे हैं। यदि आपकी स्क्रिप्ट ~ 15 mSec में निष्पादित हो रही है तो इसका समय काफी हद तक अप्रासंगिक है। यदि आप एक साझा सेवा पर चलते हैं, तो PHP छवि सक्रियण ~ 100 mSec ले जाएगा, स्क्रिप्ट फ़ाइलों में पढ़ना ~ 30-50 mSec यदि सर्वर पर पूरी तरह से कैश किया गया है, तो संभवतः 1 या अधिक सेकंड यदि बैकएंड एनएएस फार्म से लोड किया जा रहा है। पेज फर्नीचर को लोड करने में नेटवर्क देरी बहुत सारे सेकंड जोड़ सकते हैं।

यहां मुख्य मुद्दा लोड समय के लिए उपयोगकर्ताओं की धारणा है: लिंक पर क्लिक करने और पूरी तरह से प्रदान किए गए पृष्ठ पर पहुंचने के बीच उसे कितनी देर तक इंतजार करना होगा। Google पृष्ठ गति पर एक नज़र डालें, जिसे आप Ff या क्रोम एक्सटेंशन के रूप में उपयोग कर सकते हैं, और Pagespeed प्रलेखन जो गहराई से चर्चा करता है कि अच्छा पृष्ठ प्रदर्शन कैसे प्राप्त करें। इन दिशानिर्देशों का पालन करें और अपने पेज के स्कोर को 90/100 से बेहतर बनाने की कोशिश करें। (गूगल होम पेज का स्कोर 99/100 जैसा मेरा ब्लॉग है)। यह अच्छा उपयोगकर्ता-कथित प्रदर्शन पाने का सबसे अच्छा तरीका है।


0

यह सुनिश्चित करने के लिए भी अच्छा है कि आप अपने PHP कोड पर नज़र रखें और इस लिंक के साथ क्रॉस चेक करें , ताकि यह सुनिश्चित हो सके कि आपकी कोडिंग स्वयं ऐप के प्रदर्शन को परेशान नहीं कर रही है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.