আমি কীভাবে বলতে পারি যে কোন শ্রেণীর (যা সকলেই একই কাজ করে) দ্রুত কার্যকর করে? এটি পরিমাপ করার মতো কোনও সফটওয়্যার আছে?
আমি কীভাবে বলতে পারি যে কোন শ্রেণীর (যা সকলেই একই কাজ করে) দ্রুত কার্যকর করে? এটি পরিমাপ করার মতো কোনও সফটওয়্যার আছে?
উত্তর:
আপনার (কমপক্ষে) দুটি সমাধান রয়েছে:
বেশ কার্যকর "নির্বোধ" একের আগে এবং মাইক্রোটাইম (সত্য) ব্যবহার করে কোডের একটি অংশ পরে প্রয়োগ করার সময় তার কতটা সময় কেটে গেছে তা পেতে; অন্যান্য উত্তরগুলি সেগুলি বলেছে এবং ইতিমধ্যে উদাহরণ দিয়েছে, তাই আমি আরও বেশি কিছু বলতে পারব না।
আপনি কয়েকটি নির্দেশিকা বেঞ্চমার্ক করতে চাইলে এটি একটি দুর্দান্ত সমাধান; যেমন দুটি ধরণের ফাংশন তুলনা করুন, উদাহরণস্বরূপ - হাজার হাজার বার করা হলে এটি আরও ভাল হয় যে কোনও "নষ্টকারী উপাদান" গড় গড় হয়েছে তা নিশ্চিত করে নেওয়া।
এর মতো কিছু, সুতরাং, যদি আপনি জানতে চান যে কোনও অ্যারের সিরিয়ালাইজ করতে কত সময় লাগে:
$before = microtime(true);
for ($i=0 ; $i<100000 ; $i++) {
serialize($list);
}
$after = microtime(true);
echo ($after-$before)/$i . " sec/serialize\n";
নিখুঁত নয়, তবে দরকারী এবং এটি সেট আপ করতে বেশি সময় নেয় না।
অন্য সমাধানটি, এটি পুরোপুরি স্ক্রিপ্টে কোন ফাংশনটিতে প্রচুর সময় নেয় তা সনাক্ত করতে চাইলে এটি বেশ দুর্দান্ত কাজ করে:
প্রোফাইলিং ফাইলগুলি পেতে আপনাকে 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 হিসাবে ভাল হিসাবে না ... )
এটি আপনাকে আপনার অ্যাপ্লিকেশনটিতে কী সময় নেয় তার একটি দুর্দান্ত দর্শন পেতে সহায়তা করে - এবং এটি কখনও কখনও সমস্ত কাজকে ধীর করে ফাংশনটি সনাক্ত করতে অবশ্যই সহায়তা করে ^^
নোট করুন যে এক্সডিবাগ পিএইচপি দ্বারা ব্যয় করা সিপিইউ সময় গণনা করেছে; যখন পিএইচপি কোনও ডেটাবেস (উদাহরণস্বরূপ) থেকে উত্তরের জন্য অপেক্ষা করছে, এটি কাজ করছে না; শুধু অপেক্ষা। সুতরাং এক্সডিবাগ ভাববেন যে ডিবি অনুরোধটি বেশি সময় নেয় না!
এটি পিএইচপি নয়, এসকিউএল সার্ভারে প্রোফাইল করা উচিত, তাই ...
আশা করি এটি সহায়ক :-)
মজা করুন!
দ্রুত জিনিসগুলির জন্য আমি এটি করি (পিএইচপিতে):
$startTime = microtime(true);
doTask(); // whatever you want to time
echo "Time: " . number_format(( microtime(true) - $startTime), 4) . " Seconds\n";
আপনি http://xdebug.org/ এর মতো প্রোফাইলারও ব্যবহার করতে পারেন ।
আমি একটি সাধারণ টাইমিং ক্লাস করেছি, সম্ভবত এটি কারওর জন্য কার্যকর:
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
2020 আপডেট
আমি শেষ পর্যন্ত এই প্রশ্নের উত্তর দিয়েছি অনেক বছর হয়েছে তাই আমি ভেবেছিলাম এটি এপিএম ল্যান্ডস্কেপের আপডেটের যোগ্য।
আপনার প্রশ্নের সরাসরি উত্তর এখানে
এটি পরিমাপ করার মতো কোনও সফটওয়্যার আছে?
হ্যা এখানে. আমি ভাবছি কেন এখনও কেউ এটি উল্লেখ করেননি। যদিও উপরে প্রস্তাবিত উত্তরগুলি দ্রুত চেক করার জন্য ঠিক বলে মনে হচ্ছে তবে দীর্ঘমেয়াদে বা কোনও বৃহত প্রকল্পের জন্য স্কেলযোগ্য নয়।
কেন এমন অ্যাপ্লিকেশন পারফরম্যান্স মনিটরিং (এপিএম) সরঞ্জাম ব্যবহার করবেন না যা এর জন্য ঠিক আরও অনেক কিছু তৈরি করে। এক্সেকিউশন সময়, রিসোর্স ব্যবহার, পদ্ধতি প্রয়োগের প্রতিটি প্রয়োগের থ্রুপুট নিরীক্ষণের জন্য নিউরেলিক, অ্যাপডিনামিক্স, রুক্সিট (সকলেরই বিনামূল্যে সংস্করণ রয়েছে) দেখুন।
আপনি যদি কোনও ফ্রেমওয়ার্কের দ্রুত পরীক্ষার পারফরম্যান্স করতে চান তবে আপনি index.php ফাইলটি রাখতে পারেন in
//at beginning
$milliseconds = round(microtime(true) * 1000);
//and at the end
echo round(microtime(true) * 1000) - $milliseconds;
প্রতিবার আপনি মিলিসেকেন্ডে কার্যকর করার সময় পাবেন । কারণ ফ্রেমওয়ার্কের ক্ষেত্রে পরীক্ষার জন্য মাইক্রোসেকেন্ডগুলি খুব বেশি কার্যকর নয়।
আমি ইদানীং XHProf ব্যবহার করছি http://pecl.php.net/package/xhprof । এটি মূলত ফেসবুক দ্বারা বিকাশ করা হয়েছিল এবং এটি একটি শালীন ওয়েব ইন্টারফেসের সাথে আসে।
আমি 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"
}
জেন্ড স্টুডিও XDebug বা ZendDebugger ব্যবহার করে প্রোফাইলিংয়ের সমর্থনে তৈরি করেছে। এটি আপনার কোডটিকে প্রোফাইল দেবে, আপনাকে জানায় প্রতিটি ফাংশন ঠিক কত সময় নেয়। আপনার বাধা কোথায় তা খুঁজে বের করার জন্য এটি দুর্দান্ত সরঞ্জাম।
প্রয়োজনীয় সময় গণনার জন্য আপনি কোনও অপারেশনের আগে এবং পরে টাইমস্ট্যাম্পগুলি বা মাইক্রোটাইম () সংরক্ষণের মতো বেসিক স্টাফ ব্যবহার করতে পারেন। এটি করা সহজ, তবে খুব সঠিক নয়। Xdebug হতে পারে এর থেকে আরও ভাল সমাধান হ'ল আমি এর সাথে কখনই কাজ করি নি তবে মনে হয় এটি সর্বাধিক পরিচিত পিএইচপি ডিবাগার / প্রোফাইলার আমি খুঁজে পেতে পারি।