187c2fdc1SPavel Kumbrasev /*
287c2fdc1SPavel Kumbrasev     Copyright (c) 2023 Intel Corporation
387c2fdc1SPavel Kumbrasev 
487c2fdc1SPavel Kumbrasev     Licensed under the Apache License, Version 2.0 (the "License");
587c2fdc1SPavel Kumbrasev     you may not use this file except in compliance with the License.
687c2fdc1SPavel Kumbrasev     You may obtain a copy of the License at
787c2fdc1SPavel Kumbrasev 
887c2fdc1SPavel Kumbrasev         http://www.apache.org/licenses/LICENSE-2.0
987c2fdc1SPavel Kumbrasev 
1087c2fdc1SPavel Kumbrasev     Unless required by applicable law or agreed to in writing, software
1187c2fdc1SPavel Kumbrasev     distributed under the License is distributed on an "AS IS" BASIS,
1287c2fdc1SPavel Kumbrasev     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1387c2fdc1SPavel Kumbrasev     See the License for the specific language governing permissions and
1487c2fdc1SPavel Kumbrasev     limitations under the License.
1587c2fdc1SPavel Kumbrasev */
1687c2fdc1SPavel Kumbrasev 
17d489c1f7SPavel Kumbrasev #include "fibonacci_single_task.h"
18d489c1f7SPavel Kumbrasev #include "fibonacci_two_tasks.h"
1987c2fdc1SPavel Kumbrasev 
2087c2fdc1SPavel Kumbrasev #include <iostream>
2187c2fdc1SPavel Kumbrasev #include <numeric>
2287c2fdc1SPavel Kumbrasev #include <utility>
2387c2fdc1SPavel Kumbrasev 
2487c2fdc1SPavel Kumbrasev int cutoff;
25*91ba7e7eSPavel Kumbrasev bool testing_enabled;
2687c2fdc1SPavel Kumbrasev 
2787c2fdc1SPavel Kumbrasev template <typename F>
measure(F && f,int number,unsigned long ntrial)2887c2fdc1SPavel Kumbrasev std::pair</* result */ unsigned long, /* time */ unsigned long> measure(F&& f,
2987c2fdc1SPavel Kumbrasev                                                                         int number,
3087c2fdc1SPavel Kumbrasev                                                                         unsigned long ntrial) {
3187c2fdc1SPavel Kumbrasev     std::vector<unsigned long> times;
3287c2fdc1SPavel Kumbrasev 
3387c2fdc1SPavel Kumbrasev     unsigned long result;
3487c2fdc1SPavel Kumbrasev     for (unsigned long i = 0; i < ntrial; ++i) {
3587c2fdc1SPavel Kumbrasev         auto t1 = std::chrono::steady_clock::now();
3687c2fdc1SPavel Kumbrasev         result = f(number);
3787c2fdc1SPavel Kumbrasev         auto t2 = std::chrono::steady_clock::now();
3887c2fdc1SPavel Kumbrasev 
3987c2fdc1SPavel Kumbrasev         auto time = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count();
4087c2fdc1SPavel Kumbrasev         times.push_back(time);
4187c2fdc1SPavel Kumbrasev     }
4287c2fdc1SPavel Kumbrasev 
4387c2fdc1SPavel Kumbrasev     return std::make_pair(
4487c2fdc1SPavel Kumbrasev         result,
4587c2fdc1SPavel Kumbrasev         static_cast<unsigned long>(std::accumulate(times.begin(), times.end(), 0) / times.size()));
4687c2fdc1SPavel Kumbrasev }
4787c2fdc1SPavel Kumbrasev 
main(int argc,char * argv[])4887c2fdc1SPavel Kumbrasev int main(int argc, char* argv[]) {
4987c2fdc1SPavel Kumbrasev     int numbers = argc > 1 ? strtol(argv[1], nullptr, 0) : 50;
5087c2fdc1SPavel Kumbrasev     cutoff = argc > 2 ? strtol(argv[2], nullptr, 0) : 16;
5187c2fdc1SPavel Kumbrasev     unsigned long ntrial = argc > 3 ? (unsigned long)strtoul(argv[3], nullptr, 0) : 20;
52*91ba7e7eSPavel Kumbrasev     testing_enabled = argc > 4 ? (bool)strtol(argv[4], nullptr, 0) : false;
5387c2fdc1SPavel Kumbrasev 
54d489c1f7SPavel Kumbrasev     auto res = measure(fibonacci_two_tasks, numbers, ntrial);
55d489c1f7SPavel Kumbrasev     std::cout << "Fibonacci two tasks impl N = " << res.first << " Avg time = " << res.second
56d489c1f7SPavel Kumbrasev               << " ms" << std::endl;
57d489c1f7SPavel Kumbrasev 
58d489c1f7SPavel Kumbrasev     res = measure(fibonacci_single_task, numbers, ntrial);
59d489c1f7SPavel Kumbrasev     std::cout << "Fibonacci single task impl N = " << res.first << " Avg time = " << res.second
60d489c1f7SPavel Kumbrasev               << " ms" << std::endl;
6187c2fdc1SPavel Kumbrasev }
62