std::function<>
ক্যাপচার পদ্ধতিটি ব্যবহার করে একটি পুনরাবৃত্ত ফাংশন বনাম একটি পুনরাবৃত্ত ল্যাম্বদা ফাংশনের সাথে তুলনা করে আমি একটি বেঞ্চমার্ক চালিয়েছিলাম । ঝাঁকুনি দেওয়া সংস্করণ ৪.১ এ সক্ষম হওয়া সম্পূর্ণ অনুকূলিতকরণের সাথে ল্যাম্বডা সংস্করণটি উল্লেখযোগ্যভাবে ধীর গতিতে চলেছে।
#include <iostream>
#include <functional>
#include <chrono>
uint64_t sum1(int n) {
return (n <= 1) ? 1 : n + sum1(n - 1);
}
std::function<uint64_t(int)> sum2 = [&] (int n) {
return (n <= 1) ? 1 : n + sum2(n - 1);
};
auto const ITERATIONS = 10000;
auto const DEPTH = 100000;
template <class Func, class Input>
void benchmark(Func&& func, Input&& input) {
auto t1 = std::chrono::high_resolution_clock::now();
for (auto i = 0; i != ITERATIONS; ++i) {
func(input);
}
auto t2 = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count();
std::cout << "Duration: " << duration << std::endl;
}
int main() {
benchmark(sum1, DEPTH);
benchmark(sum2, DEPTH);
}
ফলাফল উত্পাদন করে:
Duration: 0 // regular function
Duration: 4027 // lambda function
(দ্রষ্টব্য: আমি এমন সংস্করণ দিয়েও নিশ্চিত করেছিলাম যা সিন থেকে ইনপুট নিয়েছিল, যাতে সংকলনের সময় মূল্যায়ন দূর করতে পারে)
বিড়ম্বনা একটি সংকলক সতর্কতাও উত্পাদন করে:
main.cc:10:29: warning: variable 'sum2' is uninitialized when used within its own initialization [-Wuninitialized]
যা প্রত্যাশিত এবং নিরাপদ, তবে লক্ষ্য করা উচিত।
আমাদের টুলবেল্টগুলিতে সমাধান পাওয়া খুব দুর্দান্ত, তবে আমি মনে করি যদি বর্তমান পদ্ধতির সাথে পারফরম্যান্সের তুলনা করা যায় তবে ভাষার ক্ষেত্রে এই কেসটি পরিচালনা করার আরও ভাল পদ্ধতির প্রয়োজন হবে।
বিঃদ্রঃ:
একজন মন্তব্যকারী হিসাবে উল্লেখ করা হয়েছে, মনে হচ্ছে ভিসি ++ এর সর্বশেষ সংস্করণ এটি সমান পারফরম্যান্সের বিন্দুতে অনুকূলিত করার একটি উপায় খুঁজে পেয়েছে। হতে পারে আমাদের সর্বোপরি (সিনট্যাকটিক চিনি ব্যতীত) এটি হ্যান্ডেল করার জন্য আরও ভাল পদ্ধতির দরকার নেই।
এছাড়াও, কিছু অন্যান্য এসও পোস্ট যেমন সাম্প্রতিক সপ্তাহগুলিতে বর্ণিত হয়েছে std::function<>
, কমপক্ষে ল্যাম্বডা ক্যাপচারটি std::function
ছোট-ফান্টেক্টরগুলির জন্য কয়েকটি লাইব্রেরি-অনুকূলিত স্থান ব্যবহারের সাথে ফিট করার জন্য লাম্বদা ক্যাপচারটি খুব বড় হয়ে গেলে সাম্প্রতিক সপ্তাহগুলিতে নিজের কর্মক্ষমতা হ্রাসের কারণ হতে পারে calling (আমি বিভিন্ন শর্ট স্ট্রিং অপটিমাইজেশনের মতো কান্ডা অনুমান করি?)।