کتابخانهی std::chrono که در C++11 به استاندارد اضافه شد و در C++17 با قابلیتهای جدیدتری مانند توابع گرد کردن (floor، ceil و round) تقویت گردید، بر پایهی سه مؤلفهی اصلی بنا شده است: بازههای زمانی (Durations)، نقاط زمانی (Time Points) و ساعتها (Clocks). این مؤلفهها با همکاری یکدیگر، امکان اندازهگیری زمان با دقتهای مختلف و بهصورت مستقل از پلتفرم را فراهم میکنند. duration یک فاصلهی زمانی مشخص را نشان میدهد، time_point یک لحظهی خاص در زمان را مشخص میکند و clock
نیز مبدأ و نرخ تیکهای زمان را تعریف مینماید. این ساختار منسجم، کار با
زمان را در C++ به تجربهای استاندارد و قابلپیشبینی تبدیل کرده است.
انتخاب ساعت مناسب برای اندازهگیری
برای اندازهگیری دقیق زمان اجرای یک قطعه کد، انتخاب نوع ساعت از اهمیت بالایی برخوردار است. سه نوع ساعت اصلی در کتابخانهی chrono وجود دارد: std::chrono::system_clock که نشاندهندهی زمان واقعی سیستم است و برای تبدیل به time_t و نمایش تقویمی کاربرد دارد، std::chrono::steady_clock که تضمین میکند هرگز به عقب بازنمیگردد و برای اندازهگیری بازههای زمانی ایدهآل است، و std::chrono::high_resolution_clock که کوتاهترین تیک ممکن را در پلتفرم هدف ارائه میدهد. برای اهداف اندازهگیری عملکرد و بنچمارک، steady_clock و high_resolution_clock بهترین گزینهها هستند، زیرا از تأثیرات تنظیمات زمان سیستم در امانمانده و دقیقترین نتایج ممکن را ارائه میدهند.
روش استاندارد اندازهگیری زمان
فرآیند اندازهگیری زمان در chrono بسیار ساده و شهودی است. ابتدا با استفاده از متد now()
از ساعت مورد نظر، یک نقطهی زمانی درست قبل از اجرای قطعهی کد مورد نظر
ثبت میشود. سپس کد مورد نظر اجرا میشود و بلافاصله پس از پایان آن، یک
نقطهی زمانی دیگر با now() ثبت میگردد. اختلاف این دو نقطهی زمانی که یک شیء از نوع duration است، دقیقاً نشاندهندهی زمان سپریشده خواهد بود.
این روش، هم ساده است و هم خطای بسیار کمی دارد؛ بهشرطی که از
بهینهسازیهای کامپایلر که ممکن است کد را تغییر دهند، آگاه باشیم.
همانطور که در مثالهای مختلف نشان داده شده، این روش بهطور گسترده برای
اندازهگیری زمان اجرای توابع و الگوریتمها مورد استفاده قرار میگیرد.
تبدیل و نمایش بازههای زمانی با واحدهای مختلف
پس
از محاسبهی اختلاف زمانی، ممکن است بخواهیم آن را در واحدهای مختلفی
مانند میلیثانیه، میکروثانیه یا حتی نانوثانیه نمایش دهیم. کتابخانهی chrono این کار را از طریق تابع duration_cast و همچنین توابع گردکنندهی جدیدتر مانند floor، ceil و round که در C++17 اضافه شدهاند، ممکن میسازد. duration_cast مقدار را بهسمت صفر گرد میکند، درحالیکه floor بهسمت منفی بینهایت، ceil بهسمت مثبت بینهایت و round بهنزدیکترین مقدار صحیح گرد مینمایند. برای مثال، با استفاده از duration<double, std::milli> میتوان زمان را بهصورت یک عدد اعشاری با دقت میلیثانیه دریافت کرد، یا با duration_cast<microseconds> آن را بهصورت یک عدد صحیح میکروثانیهای مشاهده نمود. نکتهی مهم این است که برای تبدیلهایی که خطای برش ندارند (مانند تبدیل ثانیه به میلیثانیه)، نیازی به duration_cast نیست و کامپایلر بهصورت ضمنی تبدیل را انجام میدهد.
کاربرد در بنچمارک و بهینهسازی کد
اندازهگیری دقیق زمان، سنگ بنای بهینهسازی و بنچمارک در برنامهنویسی است. با استفاده از chrono،
برنامهنویسان میتوانند تأثیر تغییرات مختلف بر روی عملکرد یک قطعه کد را
بهدقت اندازهگیری و مقایسه کنند. برای مثال، میتوان زمان اجرای دو
الگوریتم جستجوی متفاوت را با یکدیگر مقایسه کرد یا تأثیر استفاده از std::string_view
بر روی سرعت پردازش رشتهها را سنجید. همچنین با بستهبندی منطق
اندازهگیری در یک تابع الگویی (Template)، میتوان یک ابزار بنچمارک ساده
اما کارآمد ایجاد کرد که زمان اجرای هر تابعی را با دقت بالا گزارش دهد.
در نهایت، انتخاب واحد مناسب برای نمایش زمان (مثلاً میکروثانیه برای
توابع سریع و میلیثانیه برای توابع کندتر) به درک بهتر عملکرد و شناسایی
تنگناهای اجرایی کمک شایانی میکند.
کلیدواژه ها : std::chrono-اندازهگیری زمان در C++-steady_clock-high_resolution_clock-duration_cast-نقاط زمانی در chrono-بازههای زمانی C++-بنچمارک در C++-بهبود عملکرد کد-C++17 chrono-timing in C++-std::chrono::floor-std::chrono::ceil-std::chrono::round-اندازهگیری دقیق زمان-آموزش chrono-کاربرد chrono