1
2 // Copyright Oliver Kowalke 2015.
3 // Distributed under the Boost Software License, Version 1.0.
4 // (See accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
6
7 // based on https://github.com/atemerev/skynet from Alexander Temerev
8
9 #include <algorithm>
10 #include <cassert>
11 #include <chrono>
12 #include <condition_variable>
13 #include <cstddef>
14 #include <cstdint>
15 #include <cstdlib>
16 #include <queue>
17 #include <future>
18 #include <iostream>
19 #include <memory>
20 #include <mutex>
21 #include <numeric>
22 #include <random>
23 #include <sstream>
24 #include <vector>
25
26 #include "buffered_channel.hpp"
27
28 using channel_type = buffered_channel< std::uint64_t >;
29 using clock_type = std::chrono::steady_clock;
30 using duration_type = clock_type::duration;
31 using time_point_type = clock_type::time_point;
32
33 // microbenchmark
skynet(std::uint64_t num,std::uint64_t size,std::uint64_t div)34 std::uint64_t skynet( std::uint64_t num, std::uint64_t size, std::uint64_t div)
35 {
36 if ( size != 1){
37 size /= div;
38
39 std::vector<std::future<std::uint64_t> > results;
40 results.reserve( div);
41
42 for ( std::uint64_t i = 0; i != div; ++i) {
43 std::uint64_t sub_num = num + i * size;
44 results.emplace_back(
45 std::async( skynet, sub_num, size, div) );
46 }
47
48 std::uint64_t sum = 0;
49 for ( auto& f : results)
50 sum += f.get();
51
52 return sum;
53 }
54
55 return num;
56 }
57
main()58 int main() {
59 try {
60 std::size_t size{ 10000 };
61 std::size_t div{ 10 };
62 std::uint64_t result{ 0 };
63 duration_type duration{ duration_type::zero() };
64 time_point_type start{ clock_type::now() };
65 result = skynet( 0, size, div);
66 duration = clock_type::now() - start;
67 std::cout << "Result: " << result << " in " << duration.count() / 1000000 << " ms" << std::endl;
68 std::cout << "done." << std::endl;
69 return EXIT_SUCCESS;
70 } catch ( std::exception const& e) {
71 std::cerr << "exception: " << e.what() << std::endl;
72 } catch (...) {
73 std::cerr << "unhandled exception" << std::endl;
74 }
75 return EXIT_FAILURE;
76 }
77