skynet_std.cpp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #include <algorithm>
  2. #include <cassert>
  3. #include <chrono>
  4. #include <cstddef>
  5. #include <cstdint>
  6. #include <cstdlib>
  7. #include <iostream>
  8. #include <memory>
  9. #include <numeric>
  10. #include <thread>
  11. #include <vector>
  12. #include "buffered_channel.hpp"
  13. using channel_type = buffered_channel< std::uint64_t >;
  14. using clock_type = std::chrono::steady_clock;
  15. using duration_type = clock_type::duration;
  16. using time_point_type = clock_type::time_point;
  17. // microbenchmark
  18. void skynet( channel_type & c, std::size_t num, std::size_t size, std::size_t div) {
  19. if ( 1 == size) {
  20. c.push( num);
  21. } else {
  22. channel_type rc{ 16 };
  23. for ( std::size_t i = 0; i < div; ++i) {
  24. auto sub_num = num + i * size / div;
  25. std::thread{ skynet, std::ref( rc), sub_num, size / div, div }.detach();
  26. }
  27. std::uint64_t sum{ 0 };
  28. for ( std::size_t i = 0; i < div; ++i) {
  29. sum += rc.value_pop();
  30. }
  31. c.push( sum);
  32. }
  33. }
  34. int main() {
  35. try {
  36. std::size_t size{ 10000 };
  37. std::size_t div{ 10 };
  38. std::uint64_t result{ 0 };
  39. duration_type duration{ duration_type::zero() };
  40. channel_type rc{ 2 };
  41. time_point_type start{ clock_type::now() };
  42. skynet( rc, 0, size, div);
  43. result = rc.value_pop();
  44. duration = clock_type::now() - start;
  45. std::cout << "Result: " << result << " in " << duration.count() / 1000000 << " ms" << std::endl;
  46. std::cout << "done." << std::endl;
  47. return EXIT_SUCCESS;
  48. } catch ( std::exception const& e) {
  49. std::cerr << "exception: " << e.what() << std::endl;
  50. } catch (...) {
  51. std::cerr << "unhandled exception" << std::endl;
  52. }
  53. return EXIT_FAILURE;
  54. }