কীভাবে পিএইচপি স্ক্রিপ্টের দক্ষতা নির্ধারণ করা যায়


131

আমি জানতে চাই যে আমার পিএইচপি স্ক্রিপ্টগুলি বেনমার্ক করার সর্বোত্তম উপায় কী। কোনও ক্রোন জব, বা ওয়েবপেজ বা ওয়েব সার্ভিস তা বিবেচনা করে না।

আমি জানি আমি মাইক্রোটাইম ব্যবহার করতে পারি তবে এটি কি আমাকে পিএইচপি স্ক্রিপ্টের আসল সময় দিচ্ছে?

আমি পিএইচপি-তে বিভিন্ন ফাংশন পরীক্ষা করতে এবং বেঞ্চমার্ক করতে চাই যা একই কাজ করে। উদাহরণস্বরূপ, preg_matchবনাম strposবা domdocumentবনাম preg_matchবা প্রেগ_রিপ্লেস বনাম স্ট্রিংরেপ্লেস

ওয়েবপৃষ্ঠার উদাহরণ:

<?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 (সব সময় পরিবর্তিত হয় - তবে এটি আমার কাছে শেষটি ছিল)। এর অর্থ পিএইচপি স্ক্রিপ্টটি কার্যকর করতে 0.015 বা তার বেশি সময় লেগেছে।

একটি ভাল উপায় আছে কি?


এই নিবন্ধটি পড়ুন: rakesh.sankar-b.com/2011/01/12/echo-print-Wich-is- ব্রেকফাস্ট-php - আমি আশা করি এটি সাহায্য করবে।
রাকেশ শঙ্কর

4
0.015 সেকেন্ড। একটি চোখের গড় ঝলকানো গতি 0.3 সেকেন্ড। আপনার কি সত্যই, সত্যই, সেই গতির উন্নতি করার দরকার আছে, আমি জিজ্ঞাসা করতে পারি কেন?
বেন

4
@ বেন এটির একটি উদাহরণ, আমার পৃষ্ঠা এমন যা 0.8 সেকেন্ডের মধ্যে 50k এরও বেশি দর্শকদের সাথে এক ঘণ্টার মধ্যে লোড হয়ে যায় আমার নিশ্চিত করা দরকার যে পৃষ্ঠাটি দ্রুত লোড হচ্ছে
এরিিক

8
@ মারকবি অ্যামাজন স্পষ্টতই পরীক্ষা করে দেখেছিল যে 100 মিমি বিলম্বের ফলে বিক্রয় 1% ড্রপ-অফ হয়েছিল। এটি অ্যামাজনের মতো বিশাল সাইটের জন্য বিলিয়ন হতে পারে। highscalability.com/…
ceejayoz

1
@ceejayoz হ্যাঁ, আপনি যদি বিস্মিত হন তবে এটি একটি বড় সমস্যা, তবে যদি তা না হয় তবে এটির জন্য কেবল উন্মাদ পৃষ্ঠাটি লোড করার সময়টিকে তাড়া করতে সতর্ক থাকুন। অ্যামাজন তাদের বাড়ির কাজটি করেছে এবং তাই সহজেই বিক্রয়ে Y ড্রপ-অফকে পুনরায় দাবি করতে X ঘন্টা পরিমাণ মানব ব্যয়কে সহজেই প্রমাণ করতে পারে। এখানে পাঠ আপনার নিজের গৃহকর্ম করা!
জেমস বাটলার

উত্তর:


123

আপনি যদি সত্যিকারের বিশ্ব কোডটি বেঞ্চমার্ক করতে চান তবে এক্সডিবুগ এবং এক্সএইচপ্রোফের মতো সরঞ্জামগুলি ব্যবহার করুন ।

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

আপনার স্ক্রিপ্টগুলিতে আপনি যে কোডটি চালাচ্ছেন তার বাইরেও আপনাকে আপনার স্ক্রিপ্ট / পৃষ্ঠাগুলি কীভাবে দেওয়া হচ্ছে তাও দেখতে হবে। আপনি কোন ওয়েব সার্ভার ব্যবহার করছেন? উদাহরণস্বরূপ, আমি এনজিনেক্স + পিএইচপি-এফপিএমটি গুরুতরভাবে মোড_এফপি + অ্যাপাচি সম্পাদন করতে পারি, যার ফলস্বরূপ একটি ভাল সিডিএন ব্যবহার করে স্ট্যাটিক সামগ্রী সরবরাহ করার জন্য বিরক্ত হয়।

পরের বিষয়টি বিবেচনা করার জন্য আপনি কী অপ্টিমাইজ করার চেষ্টা করছেন?

  • পৃষ্ঠাটি ব্যবহারকারীদের ব্রাউজারে যে গতি দিয়ে রেন্ডার করে তা কী এক নম্বর অগ্রাধিকার?
  • সর্বনিম্ন সিপিইউ ব্যবহারের সাথে সার্ভারের প্রতিটি অনুরোধটি যত তাড়াতাড়ি সম্ভব পিছনে ফেলে দেওয়া হচ্ছে?

প্রাক্তন ব্রাউজারে প্রেরিত সমস্ত সংস্থান gziping মত কাজ করে সাহায্য করা যেতে পারে, তবুও (কিছু পরিস্থিতিতে) আপনি পরবর্তী অর্জন থেকে আরও দূরে ঠেলে দিতে পারে।

আশাকরি উপরের সমস্তটি দেখিয়ে দিতে সাহায্য করতে পারে যে সাবধানতার সাথে বিচ্ছিন্ন 'ল্যাব' পরীক্ষায় আপনি উত্পাদনের ক্ষেত্রে যে ভেরিয়েবল এবং সমস্যাগুলির প্রতিফলন করবেন না এবং আপনার উচ্চ স্তরের লক্ষ্যটি কী এবং তারপরে আপনি সেখানে কী কী পেতে পারেন তা আপনাকে অবশ্যই সনাক্ত করতে হবে, মাইক্রো / অকাল-অপ্টিমাইজেশন রুটটি জাহান্নামের দিকে নামার আগে ।


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

এক্সডিবাগ আয়নক्यूब এনকোডড স্ক্রিপ্টগুলি সমর্থন করে না। আপনি কিভাবে এই স্ক্রিপ্ট benchamrk করবেন?
বিগস্যাক

@ বিগস্যাক আপনি নিজের মতো করে সেখানে থাকুন, আমি কখনও কখনও এমন কোনও পোস্ট করার চেষ্টা করিনি। তুলনামূলকভাবে দৌড়ানোর পক্ষে সহজ হিসাবে আমি প্রথমে এক্সএইচপ্রোফের সাথে একটি শট করব। আপনি দেখতে পাবেন যে অয়ন ব্যবহারকারী কোনও ইউজারল্যান্ড প্রোফাইলারের সাথে সম্পূর্ণ হস্তক্ষেপ করে।
জেমস বাটলার

1
এনগিনেক্স বনাম অ্যাপাচি স্টেটমেন্টটি কিছুটা পক্ষপাতদুষ্ট। বেশিরভাগ অবহেলা AllowOverideযার ফলে অ্যাপাচি প্রতিটি অনুরোধে .htaccess ফাইলের জন্য পুরো ডিরেক্টরিগুলি অতিক্রম করে। এটি একা আপাচিকে তার নিজস্ব উপায় থেকে সরিয়ে দেয়।
B00MER

74

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

তুমি ব্যবহার করতে পার:


30

আপনি Xdebug এবং আরও বিশেষভাবে 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

এবং এখানে উইনক্যাসগ্রিন্ডে একটি .outফাইলের স্ক্রিনশট রয়েছে :

এখানে চিত্র বর্ণনা লিখুন

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

আপনি যদি কৌতূহলী হন তবে এটি আমার নিজের ব্যবহারের জন্য লিখে যাওয়া কোনও সিএমএসের কেবলমাত্র একটি পুরানো সংস্করণ।


8
খুব জটিল বলে মনে হচ্ছে, আমি একটি জিনিস বুঝতে পারি না
এরিক

আপনি কোন অংশ বুঝতে পারছেন না? সেটআপ বা তথ্য বিশ্লেষণ?
অ্যালেক গর্জে

1
ভাল সেটআপ নং, এটি আমার সার্ভারে কাজ করবে না তবে ডেটা, এর সমস্ত ছোট বাক্স যা আমি পড়তে পারি না
এরিক

13
কারণ আমি উইন্ডোজ ব্যবহার করি না
এরিক

2
এক্সডেবাগ + কেসিচেগ্রিন্ডের জন্য +1। এটি ইনস্টল এবং ব্যবহার করা সত্যই সহায়ক এবং আশ্চর্যরকম। আমি এটি বেশ কিছু সময়ের জন্য ব্যবহার করেছি, একটি অতিরিক্ত বোনাস আপনি পেয়ে যাবেন - এটির সাথে আপনি ফ্যামিলিয়ার হয়ে যান, আপনি আরও অনেকগুলি ভাষায় (এবং কেবল সিপিইউয়ের সময়ই নয়) প্রোফাইল দেওয়ার জন্য কেগ্রিগ্রিন্ডের সাথে ভালগ্রিন্ড (+ মেমগ্র্যান্ড / কলগ্রাইন্ড) ব্যবহার করতে পারেন।
XzKto

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
সুদৃশ্য ইন্টারফেস ডিজাইন (যেমনটি দেখছি আপনি লেখক), গ্রেটস! (এবং "প্রোপেসকেস" ব্যবহার করার জন্য ধন্যবাদ;) পদ্ধতির নামগুলি (যেমন SetMemory()) পরিবর্তে কুরুচিপূর্ণ তবে এখনও সর্বব্যাপী mixedCase()বকাঁকা, যা পিএইচপি-তে কার্যত অর্থহীন। আপনি সম্ভবত খুব বৃদ্ধ। ;))
এসজেড

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

7

আমি দেখব চাই xhprof । এটি ক্লাইমে চালানো বা অন্য স্যাপির মাধ্যমে (এফএমপি বা এফসিগি বা এমনকি অ্যাপাচি মডিউলের মতো) চালনা করা যায় না।

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

আমরা প্রায়শই প্রকৃত ট্র্যাফিক সহ নমুনাগুলি সংগ্রহ করতে এবং তারপর সেখান থেকে কোড বিশ্লেষণ করতে এক্সএইচআরফ ব্যবহার করি।

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

একবার এক্সটেনশানটি সংকলিত এবং লোড হয়ে গেলে আপনি কোডটিতে এইটির সাথে প্রোফাইলিং শুরু করুন:

xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

থামতে:

$xhprof_data = xhprof_disable();

তারপরে কোনও ফাইল বা ডাটাবেসে ডেটা সংরক্ষণ করুন - যা কিছু আপনার বোথকে ভাসিয়ে দেয় এবং স্বাভাবিক রানটাইমকে ইন্টারপুট করে না। ডেটাটিকে কেন্দ্রিক করে তোলার জন্য আমরা এসিনে ক্রমশ এটি এস 3-তে চাপছি (আমাদের সমস্ত সার্ভার থেকে সমস্ত রান দেখতে সক্ষম হতে)।

GitHub কোডটি আপনি সার্ভারে এবং সংক্ষিপ্ত কনফিগারেশন সঙ্গে ডাম্প একটি xhprof_html ফোল্ডারের রয়েছে, আপনি ডাটা সংগ্রহ ঠাহর এবং নিচে ছিদ্র শুরু করতে পারেন।

আছে HTH!


3

forআরও বাস্তবসম্মত সংখ্যা পেতে প্রতিটি জিনিস 1,000,000 বার করার জন্য এটিকে একটি লুপে রাখুন । আপনি যে কোডটি বেনমার্ক করতে চান তার ঠিক আগে টাইমারটি শুরু করুন, তারপরে শেষ সময়টি রেকর্ড করুন (অর্থাত্ টাইমারটি আগে শুরু না করে) session_start()

আপনার সময় নির্ধারণ করা ফাংশনটি বাদ দিয়ে আপনি যে মানকটি বেনমার্ক করতে চান তার প্রতিটি কোডের জন্য কোডটি অভিন্ন বলে তা নিশ্চিত করুন।

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

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


1

Xdebugs প্রোফাইলার http://xdebug.org/docs/profiler ব্যবহার করা একটি ভাল শুরু

সেট আপ এবং ব্যবহার করা সবচেয়ে সহজ জিনিস নাও হতে পারে, তবে একবার আপনি এটি ডেটা নিখরচায় ভলিউম এবং দেখার সহজতা অপরিবর্তনীয়।


0

এরিক,

আপনি নিজেকে ভুল প্রশ্ন করছেন। যদি আপনার স্ক্রিপ্টটি 15 ডলারে সেকেন্ডে চালিত হয় তবে এর সময়টি মূলত অপ্রাসঙ্গিক। আপনি যদি কোনও ভাগ করা পরিষেবা চালিয়ে যান তবে পিএইচপি চিত্র সক্রিয়করণটি ~ 100 এমসেক লাগবে, স্ক্রিপ্ট ফাইলগুলিতে পড়লে ~ 30-50 এমসেক পুরোপুরি সার্ভারে ক্যাশেড থাকে, সম্ভবত ব্যাকএন্ড এনএএস ফার্ম থেকে লোড করা থাকলে 1 বা আরও বেশি সেকেন্ড। পৃষ্ঠার আসবাবপত্র লোড করার ক্ষেত্রে নেটওয়ার্ক বিলম্ব হ'ল প্রচুর সেকেন্ড যোগ করতে পারে।

লোড সময় সম্পর্কে ব্যবহারকারীদের ধারণাটি এখানে মূল সমস্যা: লিংকে ক্লিক করতে এবং পুরোপুরি রেন্ডার করা পৃষ্ঠা পাওয়ার জন্য তাকে কতক্ষণ অপেক্ষা করতে হবে। কটাক্ষপাত আছে Google পেজ গতি যা আপনি Ff বা ক্রোম এক্সটেনশন ও PageSpeed ডকুমেন্টেশন গভীরতা যা আলোচনা করেছেন কিভাবে ভাল পৃষ্ঠা কর্মক্ষমতা বের হিসেবে ব্যবহার করতে পারেন। এই নির্দেশিকাগুলি অনুসরণ করুন এবং আপনার পৃষ্ঠার স্কোরগুলি 90/100 এর চেয়ে আরও ভাল করার চেষ্টা করুন। (গুগল হোম পেজ আমার ব্লগের মতো 99/100 স্কোর করে) ভাল ব্যবহারকারীর দ্বারা উপলব্ধ পারফরম্যান্স পাওয়ার সেরা উপায় এটি।


0

আপনার কোডিং নিজেই এই অ্যাপ্লিকেশনটির কার্য সম্পাদনকে বিরক্ত করছে না তা নিশ্চিত করার জন্য আপনার পিএইচপি কোডটিতে নজর রাখা এবং এই লিঙ্কটি দিয়ে ক্রস চেক করা ভাল is

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