আমি পিএইচপি-তে লিখিত কোডের গতি কীভাবে পরিমাপ করতে পারি? [বন্ধ]


118

আমি কীভাবে বলতে পারি যে কোন শ্রেণীর (যা সকলেই একই কাজ করে) দ্রুত কার্যকর করে? এটি পরিমাপ করার মতো কোনও সফটওয়্যার আছে?

উত্তর:


195

আপনার (কমপক্ষে) দুটি সমাধান রয়েছে:

বেশ কার্যকর "নির্বোধ" একের আগে এবং মাইক্রোটাইম (সত্য) ব্যবহার করে কোডের একটি অংশ পরে প্রয়োগ করার সময় তার কতটা সময় কেটে গেছে তা পেতে; অন্যান্য উত্তরগুলি সেগুলি বলেছে এবং ইতিমধ্যে উদাহরণ দিয়েছে, তাই আমি আরও বেশি কিছু বলতে পারব না।

আপনি কয়েকটি নির্দেশিকা বেঞ্চমার্ক করতে চাইলে এটি একটি দুর্দান্ত সমাধান; যেমন দুটি ধরণের ফাংশন তুলনা করুন, উদাহরণস্বরূপ - হাজার হাজার বার করা হলে এটি আরও ভাল হয় যে কোনও "নষ্টকারী উপাদান" গড় গড় হয়েছে তা নিশ্চিত করে নেওয়া।

এর মতো কিছু, সুতরাং, যদি আপনি জানতে চান যে কোনও অ্যারের সিরিয়ালাইজ করতে কত সময় লাগে:

$before = microtime(true);

for ($i=0 ; $i<100000 ; $i++) {
    serialize($list);
}

$after = microtime(true);
echo ($after-$before)/$i . " sec/serialize\n";

নিখুঁত নয়, তবে দরকারী এবং এটি সেট আপ করতে বেশি সময় নেয় না।



অন্য সমাধানটি, এটি পুরোপুরি স্ক্রিপ্টে কোন ফাংশনটিতে প্রচুর সময় নেয় তা সনাক্ত করতে চাইলে এটি বেশ দুর্দান্ত কাজ করে:

  • Xdebug এক্সটেনশন, স্ক্রিপ্টের জন্য ডেটা প্রোফাইলিং জেনারেট করতে
  • সফ্টওয়্যার যা প্রোফাইলিং ডেটা পড়ে এবং আপনাকে পাঠযোগ্য কিছু উপস্থাপন করে। আমি তাদের মধ্যে তিনটি জানি:

প্রোফাইলিং ফাইলগুলি পেতে আপনাকে Xdebug ইনস্টল ও কনফিগার করতে হবে; কটাক্ষপাত করা প্রোফাইলিং পিএইচপি স্ক্রিপ্ট নথিপত্রের পাতা।

আমি সাধারণত যা করি তা ডিফল্টরূপে প্রোফাইলার সক্ষম করে না (এটি বেশ বড় ফাইল তৈরি করে এবং জিনিসগুলি ধীর করে দেয়) , তবে XDEBUG_PROFILEকেবল প্রয়োজনীয় পৃষ্ঠার জন্য প্রোফাইলিং সক্রিয় করতে জিইটি ডেটা নামে পরিচিত একটি পরামিতি প্রেরণ করার সম্ভাবনাটি ব্যবহার করুন ।
আমার php.ini এর প্রোফাইল-সম্পর্কিত অংশটি দেখতে এমন দেখাচ্ছে:

xdebug.profiler_enable = 0              ; Profiling not activated by default
xdebug.profiler_enable_trigger = 1      ; Profiling activated when requested by the GET parameter
xdebug.profiler_output_dir = /tmp/ouput_directory
xdebug.profiler_output_name = files_names

(আরও তথ্যের জন্য ডকুমেন্টেশন পড়ুন)

এই স্ক্রিনশটটি KcacheGrind একটি সি ++ প্রোগ্রাম থেকে হল: (সূত্র: sourceforge.net ) আপনি পিএইচপি স্ক্রিপ্ট ;-) সঙ্গে জিনিস ঠিক একই ধরনের পাবেন (KCacheGrind সঙ্গে, আমি বলতে চাচ্ছি; WinCacheGrind KCacheGrind হিসাবে ভাল হিসাবে না ... )http://kcachegrind.sourceforge.net/html/pics/KcgShot3Large.gif



এটি আপনাকে আপনার অ্যাপ্লিকেশনটিতে কী সময় নেয় তার একটি দুর্দান্ত দর্শন পেতে সহায়তা করে - এবং এটি কখনও কখনও সমস্ত কাজকে ধীর করে ফাংশনটি সনাক্ত করতে অবশ্যই সহায়তা করে ^^

নোট করুন যে এক্সডিবাগ পিএইচপি দ্বারা ব্যয় করা সিপিইউ সময় গণনা করেছে; যখন পিএইচপি কোনও ডেটাবেস (উদাহরণস্বরূপ) থেকে উত্তরের জন্য অপেক্ষা করছে, এটি কাজ করছে না; শুধু অপেক্ষা। সুতরাং এক্সডিবাগ ভাববেন যে ডিবি অনুরোধটি বেশি সময় নেয় না!
এটি পিএইচপি নয়, এসকিউএল সার্ভারে প্রোফাইল করা উচিত, তাই ...


আশা করি এটি সহায়ক :-)
মজা করুন!


1
কিউচেগ্রিন্ডের একটি উইন্ডোজ বিল্ড বিদ্যমান :-) উত্স
ব্রেটন

43

দ্রুত জিনিসগুলির জন্য আমি এটি করি (পিএইচপিতে):

$startTime = microtime(true);
doTask(); // whatever you want to time
echo "Time:  " . number_format(( microtime(true) - $startTime), 4) . " Seconds\n";

আপনি http://xdebug.org/ এর মতো প্রোফাইলারও ব্যবহার করতে পারেন ।


2
অতিরিক্ত নির্ভুলতার জন্য, আমি (ক) একটি লুপ ব্যবহার এবং সময় গড় এবং (খ) আপনি যা যা পরীক্ষা করে নিচ্ছেন তার প্রতিটি জন্য পৃথক ফাইল ব্যবহার করার পরামর্শ দেব। যদি আপনার একটি স্ক্রিপ্টের মধ্যে বেশ কয়েকটি সময় থাকে তবে তাদের ক্রমটি মাঝে মধ্যে একটি পার্থক্য আনতে পারে।
অসন্তুষ্ট গোয়াট

9

আমি একটি সাধারণ টাইমিং ক্লাস করেছি, সম্ভবত এটি কারওর জন্য কার্যকর:

class TimingHelper {

    private $start;

    public function __construct() {
        $this->start = microtime(true);
    }

    public function start() {
        $this->start = microtime(true);
    }

    public function segs() {
        return microtime(true) - $this->start;
    }

    public function time() {
        $segs = $this->segs();
        $days = floor($segs / 86400);
        $segs -= $days * 86400;
        $hours = floor($segs / 3600);
        $segs -= $hours * 3600;
        $mins = floor($segs / 60);
        $segs -= $mins * 60;
        $microsegs = ($segs - floor($segs)) * 1000;
        $segs = floor($segs);

        return 
            (empty($days) ? "" : $days . "d ") . 
            (empty($hours) ? "" : $hours . "h ") . 
            (empty($mins) ? "" : $mins . "m ") . 
            $segs . "s " .
            $microsegs . "ms";
    }

}

ব্যবহার করুন:

$th = new TimingHelper();
<..code being mesured..>
echo $th->time();
$th->start(); // if it's the case
<..code being mesured..>
echo $th->time();

// result: 4d 17h 34m 57s 0.00095367431640625ms 

আপনি ভুল টাইপ: এটা echoনা$echo
সূর্য

9

2020 আপডেট

আমি শেষ পর্যন্ত এই প্রশ্নের উত্তর দিয়েছি অনেক বছর হয়েছে তাই আমি ভেবেছিলাম এটি এপিএম ল্যান্ডস্কেপের আপডেটের যোগ্য।

  • অ্যাপডিনামিকস সিসকো কিনে নিয়েছে এবং তারা যে অফারটি ব্যবহার করত তা বিনামূল্যে তাদের ওয়েবসাইট থেকে বের করে নেওয়া হয়েছিল।
  • নিউআরলিক এপিএম বাজারে নতুন আগতদের সাথে প্রতিযোগিতা করার জন্য তাদের দাম 149 / মাস / হোস্ট থেকে 25 ডলার / মাস / হোস্টে নামিয়ে দিয়েছে, যা Dat 31 / মাস / হোস্ট অফার করে Dat
  • ডেটাডোগ এপিএম বৈশিষ্ট্যগুলি এখনও হালকা এবং এর জন্য পছন্দসই পরিমাণে অনেকগুলি ছেড়ে leaves তবে, আমি তাদের পরবর্তী বছর জুড়ে এগুলি উন্নত ও উন্নতি করতে দেখছি।
  • রুকিত কিনে নিয়েছেন ডায়নাত্রেস। প্রাক্তন ডায়নাত্রেস কর্মচারী দ্বারা রুক্সিট নির্মিত হওয়ায় এখানে কোনও ধাক্কা খাওয়ার দরকার নেই। এটি ডায়নাত্রেসকে আরও ভালর জন্য সত্যিকারের সাআস মডেলে রূপান্তরিত করতে সহায়তা করেছিল। আপনি চাইলে সেই ভারী জাভা ক্লায়েন্টকে বিদায় জানান।
  • ফ্রি / ওপেন সোর্স বিকল্পগুলি এখন রয়েছে। চেকআউট এ্যাপাচি Skywalking যা তাদের শীর্ষ কারিগরি কোম্পানীর মধ্যে চীন খুব জনপ্রিয় এবং তুচ্ছ বিষয় যা একটি ডেমো যে আপনার ইনস্টল করার পূর্বে চেষ্টা করতে পারেন উপলব্ধ করা হয়। এই দুটির জন্যই আপনার হোস্টিং পরিচালনা করা দরকার তাই কয়েকটি ভার্চুয়াল মেশিন স্পিন করতে প্রস্তুত এবং ইনস্টলেশন এবং কনফিগারেশনের সাথে কিছুটা সময় ব্যয় করুন।
  • আমি এই ওপেনসোর্স এপিএম সমাধানগুলির মধ্যে একটিও চেষ্টা করে দেখিনি তাই আমি তাদের সুপারিশ করার মতো অবস্থানে নেই, তবে ব্যক্তিগতভাবে আমি এই সমস্ত এপিএম সমাধানগুলি একাধিক সংস্থার জন্য হয় প্রাক-ভিত্তিতে বা মেঘে শত শত অ্যাপ্লিকেশন / microservices। সুতরাং আমি আত্মবিশ্বাসের সাথে বলতে পারি, কোনও বিক্রেতারা যদি আপনার বিলটি ফিট করে তবে আপনি কোনওটির সাথে ভুল করতে পারবেন না।


অক্টোবর 2015 এ মূল উত্তর দেওয়া হয়েছে

আপনার প্রশ্নের সরাসরি উত্তর এখানে

এটি পরিমাপ করার মতো কোনও সফটওয়্যার আছে?

হ্যা এখানে. আমি ভাবছি কেন এখনও কেউ এটি উল্লেখ করেননি। যদিও উপরে প্রস্তাবিত উত্তরগুলি দ্রুত চেক করার জন্য ঠিক বলে মনে হচ্ছে তবে দীর্ঘমেয়াদে বা কোনও বৃহত প্রকল্পের জন্য স্কেলযোগ্য নয়।

কেন এমন অ্যাপ্লিকেশন পারফরম্যান্স মনিটরিং (এপিএম) সরঞ্জাম ব্যবহার করবেন না যা এর জন্য ঠিক আরও অনেক কিছু তৈরি করে। এক্সেকিউশন সময়, রিসোর্স ব্যবহার, পদ্ধতি প্রয়োগের প্রতিটি প্রয়োগের থ্রুপুট নিরীক্ষণের জন্য নিউরেলিক, অ্যাপডিনামিক্স, রুক্সিট (সকলেরই বিনামূল্যে সংস্করণ রয়েছে) দেখুন।


6

আপনি যদি কোনও ফ্রেমওয়ার্কের দ্রুত পরীক্ষার পারফরম্যান্স করতে চান তবে আপনি index.php ফাইলটি রাখতে পারেন in

//at beginning
$milliseconds = round(microtime(true) * 1000);

//and at the end
echo round(microtime(true) * 1000) - $milliseconds;

প্রতিবার আপনি মিলিসেকেন্ডে কার্যকর করার সময় পাবেন । কারণ ফ্রেমওয়ার্কের ক্ষেত্রে পরীক্ষার জন্য মাইক্রোসেকেন্ডগুলি খুব বেশি কার্যকর নয়।


5

আমি ইদানীং XHProf ব্যবহার করছি http://pecl.php.net/package/xhprof । এটি মূলত ফেসবুক দ্বারা বিকাশ করা হয়েছিল এবং এটি একটি শালীন ওয়েব ইন্টারফেসের সাথে আসে।


4

আমি 10 টি যুক্তি অবধি যে কোনও বিদ্যমান ফাংশনটির গতি মাপতে আমি একটি স্ব-তৈরি ফাংশন আপনার সাথে ভাগ করতে চাই:

function fdump($f_name='', $f_args=array()){

    $f_dump=array();
    $f_result='';

    $f_success=false;

    $f_start=microtime();
    $f_start=explode(' ', $f_start);
    $f_start=$f_start[1] + $f_start[0];

    if(function_exists($f_name)){

        if(isset($f_args[0])&&is_array($f_args[0])){
            if($f_result=$f_name($f_args)){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[1])){
            if($f_result=$f_name($f_args[0])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[2])){
            if($f_result=$f_name($f_args[0],$f_args[1])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[3])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[4])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[5])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[6])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[7])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[8])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[9])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7],$f_args[8])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[10])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7],$f_args[8],$f_args[9])){
                $f_success=true;
            }
        }
    }
    $f_end=microtime();
    $f_end=explode(' ', $f_end);
    $f_end=$f_end[1] + $f_end[0];

    $f_time=round(($f_end - $f_start), 4);
    $f_dump['f_success']=$f_success;
    $f_dump['f_time']=$f_time;
    $f_dump['f_result']=$f_result;

    var_dump($f_dump);exit;

    //return $f_result;

}

উদাহরণ

function do_stuff($arg1='', $arg2=''){
    return $arg1.' '.$arg2;
}

fdump('do_stuff',array('hello', 'world'));

রিটার্নস

  array(3) {
    ["f_success"]=>
    bool(true)
    ["f_time"]=>
    float(0)            //too fast...
    ["f_result"]=>
    string(11) "hello world"
  }

3

যদি এটি এমন কিছু হয় যা ওয়েব প্রসঙ্গে বাইরে পরীক্ষা করা যায় তবে আমি কেবল ইউনিক্স timeকমান্ডটি ব্যবহার করি ।


3

জেন্ড স্টুডিও XDebug বা ZendDebugger ব্যবহার করে প্রোফাইলিংয়ের সমর্থনে তৈরি করেছে। এটি আপনার কোডটিকে প্রোফাইল দেবে, আপনাকে জানায় প্রতিটি ফাংশন ঠিক কত সময় নেয়। আপনার বাধা কোথায় তা খুঁজে বের করার জন্য এটি দুর্দান্ত সরঞ্জাম।


1

প্রয়োজনীয় সময় গণনার জন্য আপনি কোনও অপারেশনের আগে এবং পরে টাইমস্ট্যাম্পগুলি বা মাইক্রোটাইম () সংরক্ষণের মতো বেসিক স্টাফ ব্যবহার করতে পারেন। এটি করা সহজ, তবে খুব সঠিক নয়। Xdebug হতে পারে এর থেকে আরও ভাল সমাধান হ'ল আমি এর সাথে কখনই কাজ করি নি তবে মনে হয় এটি সর্বাধিক পরিচিত পিএইচপি ডিবাগার / প্রোফাইলার আমি খুঁজে পেতে পারি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.