skynet_async.cpp 2.1 KB

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