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