স্কট মায়ার্স বইতে আমি সর্বজনীন জেনেরিক ল্যাম্বডা অভিব্যক্তির একটি উদাহরণ পেয়েছি যা ফাংশন সম্পাদনের সময় পরিমাপ করার জন্য ব্যবহার করা যেতে পারে। (সি ++ 14)
auto timeFuncInvocation =
[](auto&& func, auto&&... params) {
// get time before function invocation
const auto& start = std::chrono::high_resolution_clock::now();
// function invocation using perfect forwarding
std::forward<decltype(func)>(func)(std::forward<decltype(params)>(params)...);
// get time after function invocation
const auto& stop = std::chrono::high_resolution_clock::now();
return stop - start;
};
সমস্যাটি হ'ল আপনি কেবলমাত্র একটি নির্বাহকে পরিমাপ করছেন যাতে ফলাফলগুলি খুব আলাদা হতে পারে। একটি নির্ভরযোগ্য ফলাফল পেতে আপনার কার্যকর পরিমাণের একটি বিশাল পরিমাণ পরিমাপ করা উচিত। কোড :: ডাইভ 2015 সম্মেলনে আন্ড্রেই আলেকজান্দ্রেস্কু বক্তৃতা অনুসারে - ফাস্ট কোড আই লিখন:
পরিমাপ করা সময়: tm = t + tq + tn + to
কোথায়:
tm - পরিমাপ (পর্যবেক্ষণ) সময়
t - আগ্রহের আসল সময়
tq - সময় সংযোজন আওয়াজ দ্বারা যোগ করা
tn - সময় শব্দের বিভিন্ন উত্স দ্বারা যুক্ত
থেকে - ওভারহেড সময় (পরিমাপ, লুপিং, কলিং ফাংশন)
বক্তৃতার পরে তিনি যা বলেছিলেন সে অনুসারে আপনার ফলাফল হিসাবে আপনার এই বিশাল সংখ্যক কার্যকর হওয়া উচিত। আমি আপনাকে উত্সাহিত করি যে বক্তৃতায় তিনি কেন ব্যাখ্যা করেছেন তা দেখার জন্য।
এছাড়াও গুগল থেকে একটি খুব ভাল গ্রন্থাগার রয়েছে - https://github.com/google/benchmark । এই গ্রন্থাগারটি ব্যবহার করা খুব সহজ এবং শক্তিশালী। আপনি ইউটিউবে চ্যানডলার ক্যারথের কয়েকটি বক্তৃতা চেকআউট করতে পারেন যেখানে তিনি অনুশীলনে এই গ্রন্থাগারটি ব্যবহার করছেন। উদাহরণস্বরূপ CppCon 2017: চ্যানডলার ক্যারুথ "আরও কোথাও চলছে";
ব্যবহারের উদাহরণ:
#include <iostream>
#include <chrono>
#include <vector>
auto timeFuncInvocation =
[](auto&& func, auto&&... params) {
// get time before function invocation
const auto& start = high_resolution_clock::now();
// function invocation using perfect forwarding
for(auto i = 0; i < 100000/*largeNumber*/; ++i) {
std::forward<decltype(func)>(func)(std::forward<decltype(params)>(params)...);
}
// get time after function invocation
const auto& stop = high_resolution_clock::now();
return (stop - start)/100000/*largeNumber*/;
};
void f(std::vector<int>& vec) {
vec.push_back(1);
}
void f2(std::vector<int>& vec) {
vec.emplace_back(1);
}
int main()
{
std::vector<int> vec;
std::vector<int> vec2;
std::cout << timeFuncInvocation(f, vec).count() << std::endl;
std::cout << timeFuncInvocation(f2, vec2).count() << std::endl;
std::vector<int> vec3;
vec3.reserve(100000);
std::vector<int> vec4;
vec4.reserve(100000);
std::cout << timeFuncInvocation(f, vec3).count() << std::endl;
std::cout << timeFuncInvocation(f2, vec4).count() << std::endl;
return 0;
}
সম্পাদনা: অবশ্যই আপনার সর্বদা মনে রাখা দরকার যে আপনার সংকলক কিছু অপ্টিমাইজ করতে পারে বা না পারে। পারফের মতো সরঞ্জামগুলি এ জাতীয় ক্ষেত্রে কার্যকর হতে পারে।
clock_gettime
.. গিগি অন্যান্য ঘড়ির সংজ্ঞা দেয়:typedef system_clock steady_clock; typedef system_clock high_resolution_clock;
উইন্ডোজে, ব্যবহার করুনQueryPerformanceCounter
।