کلاس بنچمارک

مجتبی پاکزاد کدایگنایتر 3.1.9 در حال تکمیل رایگان

کدایگنایتر یک کلاس بنچمارک دارد که همیشه فعال است و قادر است اختلاف زمانی بین هر دو نقطه مشخص شده‌ای را محاسبه کند.

اصطلاحات فنی

بنچمارک (Benchmark) یعنی ارزیابی و توان‌سنجی مقایسه‌ای. از کلاس بنچمارک در کدایگنایتر می‌توانید برای محاسبه زمان سپری شده بین دو پوینت (نقطه) استفاده کنید. مثلا، می‌خواهید زمان اجرای دستورات داخل یک حلقه را بدانید. همچنین از این کلاس برای محاسبه زمان اجرای کامل اسکریپت و میزان مصرف مموری نیز می‌توانید استفاده کنید.

علاوه بر این، می‌توانید نتایج بنچمارک را به کلاس Profiler ارائه دهید تا بتوانید با استفاده از کلاس پروفایلر، ضمن دیباگ اپلیکیشن، پرفورمنس آن را نیز بالا ببرید.

توجه

این کلاس به صورت خودکار توسط سیستم لود می‌شود، بنابراین نیازی به انجام این کار به صورت دستی نیست.

علاوه بر این، کلاس بنچمارک همیشه همزمان با فراخوانی فریمورک، شروع می‌شود و توسط کلاس خروجی (output) و دقیقا قبل از ارسال ویو نهایی به مرورگر، پایان می‌یابد. این کلاس قادر است زمان اجرای کامل سیستم را با دقت خیلی زیادی نشان دهد.

استفاده از کلاس بنچمارک

از کلاس بنچمارک می‌توانید در کنترلر، ویو و یا مدل خود استفاده کنید. پروسه استفاده به صورت زیر است:

  1. نقطه شروع را مشخص کنید.
  2. نقطه پایان را مشخص کنید.
  3. برای مشاهده نتیجه، فانکشن elapsed_time() را اجرا کنید.

مثال زیر را ببینید:

$this->benchmark->mark('code_start');

// Some code happens here

$this->benchmark->mark('code_end');

echo $this->benchmark->elapsed_time('code_start', 'code_end');

توجه

استفاده از کلمات code_start و code_end اختیاری است. این دو، کلماتی ساده (در واقع مارکرهایی - marker) هستند که برای مشخص کردن و علامتگذاری نقاط استفاده می‌شوند. هر کلمه‌ای که دوست دارید می‌توانید به جای آن‌ها استفاده کنید و می‌توانید از چندین مارکر برای علامتگذاری نقاط استفاده کنید. به مثال زیر توجه کنید:

$this->benchmark->mark('dog');

// Some code happens here

$this->benchmark->mark('cat');

// More code happens here

$this->benchmark->mark('bird');

echo $this->benchmark->elapsed_time('dog', 'cat');
echo $this->benchmark->elapsed_time('cat', 'bird');
echo $this->benchmark->elapsed_time('dog', 'bird');

پروفایلینگِ نقاط بنچمارک

اگر می‌خواهید کلاس پروفایلر (Profiler) به تمام داده‌های بنچمارک دسترسی داشته باشد، تمام نقاطی که علامتگذاری کرده‌اید باید به صورت جفت تعریف شوند و نام هر نقطه علامتگذاری شده (mark point) باید با _start یا پایان یابد. هر جفت پوینت (زوجِ نقطه‌ها) باید با همین الگوی دارای نام دقیقا یکسانی باشند. مثال:

$this->benchmark->mark('my_mark_start');

// Some code happens here...

$this->benchmark->mark('my_mark_end');

$this->benchmark->mark('another_mark_start');

// Some more code happens here...

$this->benchmark->mark('another_mark_end');

برای اطلاعات بیشتر ارزیابی و تجزیه و تحلیل عملکرد اپلیکیشن را بخوانید.

نمایش کل زمان اجرا

اگر می‌خواهید کل زمان سپری شده از لحظه شروع کدایگنایتر تا لحظه ارسال خروجی نهایی به مرورگر را نشان دهید، کافی است کد زیر را در فایل ویو مورد نظرتان قرار دهید:

<?php echo $this->benchmark->elapsed_time();?>

با کمی دقت متوجه خواهید شد که این همان فانکشن مثال بالا است که برای محاسبه زمان بین دو نقطه از آن استفاده کردیم، به جز اینکه، این‌بار هیچ پارامتری به این فانکشن پاس نداده‌ایم. هنگامی که پارامترها وجود ندارند، کدایگنایتر بنچمارک را دقیقا تا زمان ارسال خروجی نهایی به مرورگر متوقف نمی‌کند. مهم نیست کجا فانکشن را فراخوانی کنید، تایمر عینا تا پایان اجرای اسکریپت به کار خود ادامه خواهد داد.

اگر ترجیح می‌دهید به صورت Pure PHP کدنویسی نکنید، یک روش جایگزین برای نمایش زمان سپری شده در فایل‌های ویو، استفاده از شبه متغییر (متغییر کاذب) است:

{elapsed_time}

توجه

اگر هر چیزی را می‌خواهید در متدهای کنترلر خود بنچمارک کنید، باید نقاط آغاز و پایان خود را برای آن تنظیم کنید.

نمایش مصرف حافظه

اگر enable-memory-limit در ورژن نصب شده PHP در سرور شما، کانفیگ شده باشد، می‌توانید مقدار مصرف حافظه توسط کل سیستم را، با قرار دادن کد زیر در یکی از فایل‌های ویو خود نشان دهید:

<?php echo $this->benchmark->memory_usage();?></pre?

توجه

از این فانکشن فقط در فایل‌های ویو خود می‌توانید استفاده کنید. مقدار مصرف، کل مموری استفاده شده توسط کل اپلیکیشن را نشان می‌دهد.

اگر ترجیح می‌دهید به صورت Pure PHP کدنویسی نکنید، یک روش جایگزین برای نمایش میزان مصرف مموریدر فایل‌های ویو، استفاده از شبه متغییر (متغییر کاذب) است:

{memory_usage}

رفرنس کلاس

کلاس CI_Benchmark

mark($name)
پارامترها
  • $name نوع استرینگ - نامی که می‌خواهید به مارکر خود بدهید
مقدار بازگشتی void (مقدار بازگشتی ندارد)

مارکر بنچمارک را سِت می‌کند.

elapsed_time([$point1 = ''[, $point2 = ''[, $decimals = 4]]])
پارامترها
  • $point1 نوع استرینگ - یک نقطه علامتگذاری شده خاص
  • $point2 نوع آرایه - یک نقطه علامتگذاری شده خاص
  • $decimals نوع آرایه - محل قرار گرفتن اعشار برای تعیین دقت محاسبه
مقدار بازگشتی زمان سپری شده
نوع مقدار بازگشتی استرینگ

زمان سپری شده بین دو نقطه علامتگذاری شده را محاسبه کرده و مقدار آن را برمی‌گرداند.

اگر پارامتر اول این فانکشن خالی باشد، شبه متغییر {elapsed_time} را برمی‌گرداند. که امکان نمایش زمان اجرای کامل سیستم در یک تمپلت را فراهم می‌آورد. کلاس output مقدار واقعی را جایگزین مقدار این متغییر می‌کند.

memory_usage()
مقدار بازگشتی اطلاعاتی درباره میزان مصرف حافظه
نوع مقدار بازگشتی استرینگ

در حقیقت مارکر {memory_usage} را برمی‌گرداند.

این امکان را به شما می‌دهد تا در هر جایی از تمپلت قرار گیرد و تا پایان اجرای اسکریپت به محاسبه مقدار مموری مصرف شده ادامه می‌دهد. کلاس output مقدار واقعی را جایگزین مقدار این متغییر می‌کند.