رفتن به متن راهنما
همه‌ی راهنماها

بنچمارک

یک ریزبنچمارک کوچک از RTLY-Kit در برابر morilog/jalali، با روش کامل، نکته‌ها و یک دستور برای تکرار آن روی ماشین خودتان.

برنامه RTLY-Kit 0.2.0آخرین بررسی زمان خواندن 4 دقیقه

در این صفحه

خوب است بدانید. این‌ها ریزبنچمارکِ سه سناریوی کوچک‌اند که یک بار روی یک ماشین اجرا شده‌اند. هزینهٔ نسبی را برای همین کار نشان می‌دهند و حکم کلی نیستند. پیش از نقل هر عدد، خودتان با دستور پایین دوباره اجرا کنید.

چه چیزی مقایسه شده

بستهٔ morilog/jalali (opens in a new tab) نسخهٔ 3.5.0 (پرکاربردترین بستهٔ جلالی) در برابر RTLY-Kit، روی سه کار:

سناریوRTLY-Kitmorilog/jalali
رشتهٔ میلادی به جلالی Y/m/dJalali::make('2025-03-21')->format('Y/m/d')Jalalian::fromDateTime('2025-03-21')->format('Y/m/d')
جلالی y/m/d به میلادی Y-m-dJalali::create(1404, m, d)->toGregorian()->format('Y-m-d')(new Jalalian(1404, m, d))->toCarbon()->format('Y-m-d')
addDays و بعد قالب‌بندیJalali::create(1404, 1, 1)->addDays(n)->format('Y/m/d')(new Jalalian(1404, 1, 1))->addDays(n)->format('Y/m/d')

سمت RTLY-Kit هر سناریو، همان‌طور که در برنامه می‌نویسید:

PHP
<?php
require __DIR__.'/vendor/autoload.php';

use RtlyKit\Calendar\Jalali;

echo Jalali::make('2025-03-21')->format('Y/m/d'), "\n";                       // 1404/01/01
echo Jalali::create(1404, 1, 1)->toGregorian()->format('Y-m-d'), "\n";       // 2025-03-21
echo Jalali::create(1404, 1, 1)->addDays(100)->format('Y/m/d'), "\n";        // 1404/04/08

نتیجه‌ها

یک اجرا، میانهٔ ۵ تکرار که هر کدام ۲۰٬۰۰۰ دور حلقه دارد. محیط: PHP 8.2.30 در CLI داخل Docker روی ویندوز ۱۱، با opcache.enable_cli=1.

سناریوRTLY-Kit (µs/op)morilog/jalali (µs/op)نسبت
رشتهٔ میلادی به جلالی Y/m/d13.33153.8411.5x
جلالی y/m/d به میلادی Y-m-d12.8058.554.6x
addDays + قالب‌بندی33.18479.0414.4x

بیشترین حافظهٔ کل فرایند، با بارگذاری هر دو کتابخانه، ۴ مگابایت (MiB) بود.

یک اجرای قبلی، بدون opcache و با ترکیب دیگری از سناریوها، فاصلهٔ بیشتری نشان داد (حدود ۲۵ برابر). این تفاوت نشان می‌دهد نسبت به سناریو و تنظیمات PHP بستگی دارد.

مقایسهٔ درستی

برای تک‌تک روزها از 1900-01-01 تا 2099-12-27 (۷۳٬۰۰۰ روز پشت‌هم)، تاریخ جلالی RTLY-Kit با نتیجهٔ CalendarUtils::toJalali در morilog یکی است و هیچ اختلافی نیست. هر دو از قاعدهٔ حسابی کبیسهٔ ۳۳ ساله استفاده می‌کنند، پس این مقایسه نشان می‌دهد این دو با هم می‌خوانند. برای تطابق با تقویم رسمی، دقت و داده را ببینید.

چرا فرق دارند؟

این را پروفایل نکرده‌ایم، پس موارد زیر محتمل‌اند و ثابت‌شده نیستند. RTLY-Kit یک DateTimeImmutable ساده را می‌پوشاند و با حساب عدد صحیح تبدیل می‌کند. morilog شیءهای Carbon می‌سازد و تغییر می‌دهد که خیلی بزرگ‌ترند (کد پارس و زبان محلی). پس بخشی از فاصله از انتخاب معماری می‌آید، نه فقط الگوریتم تبدیل. اگر همه‌جا از Carbon استفاده می‌کنید، فاصله‌ای که برای شما مهم است شاید کمتر باشد.

تکرار آزمایش

بنچمارک در مخزن، در پوشهٔ tools/benchmark است. composer.json آن RTLY-Kit را از درخت کاری نصب می‌کند و morilog/jalali را در پوشهٔ vendor/ خودش (که جزو بسته نیست). اسکریپت نسخهٔ PHP، تنظیمات opcache و JIT و میانهٔ تکرارها را چاپ می‌کند.

Bash
docker compose -f tools/docker-compose.yml run --rm php sh -c 'cd tools/benchmark && composer install -n && php -d opcache.enable_cli=1 run.php 20000 5'

عددهای ماشین‌های مختلف با هم قابل مقایسه نیستند.

این بنچمارک چه چیزی را نمی‌پوشاند

  • فقط سه سناریو. کار سنگین قالب‌بندی، پارس یا آرایه‌های بزرگ در آن نیست.
  • یک ماشین و یک ساخت PHP. Docker روی ویندوز نویز اضافه می‌کند.
  • حافظهٔ هر شیء اندازه‌گیری نشده، فقط بیشترین حافظهٔ کل.
  • فقط morilog/jalali سنجیده شد، نه بسته‌های دیگر.