Harness.cc 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // Performance/Harness.cc - C++ performance harness definition
  2. //
  3. // Copyright (c) 2014 - 2016 Apple Inc. and the project authors
  4. // Licensed under Apache License v2.0 with Runtime Library Exception
  5. //
  6. // See LICENSE.txt for license information:
  7. // https://github.com/apple/swift-protobuf/blob/main/LICENSE.txt
  8. //
  9. // -----------------------------------------------------------------------------
  10. ///
  11. /// Defines the class that runs the performance tests.
  12. ///
  13. // -----------------------------------------------------------------------------
  14. #include <chrono>
  15. #include <cstdio>
  16. #include <cmath>
  17. #include <iostream>
  18. #include <string>
  19. #include <type_traits>
  20. #include <vector>
  21. #include "Harness.h"
  22. using std::chrono::duration_cast;
  23. using std::chrono::steady_clock;
  24. using std::endl;
  25. using std::function;
  26. using std::ostream;
  27. using std::result_of;
  28. using std::sqrt;
  29. using std::string;
  30. using std::vector;
  31. Harness::Harness(std::ostream* results_stream) :
  32. results_stream(results_stream),
  33. measurement_count(10),
  34. repeated_count(10) {}
  35. void Harness::write_to_log(const string& name,
  36. const vector<microseconds_d>& timings) const {
  37. if (results_stream == nullptr) {
  38. return;
  39. }
  40. (*results_stream) << "\"" << name << "\": [";
  41. for (const auto& duration : timings) {
  42. auto micros = duration_cast<microseconds_d>(duration);
  43. (*results_stream) << micros.count() / run_count() << ", ";
  44. }
  45. (*results_stream) << "]," << endl;
  46. }
  47. Harness::Statistics Harness::compute_statistics(
  48. const vector<steady_clock::duration>& timings) const {
  49. microseconds_d::rep sum = 0;
  50. microseconds_d::rep sqsum = 0;
  51. for (const auto& duration : timings) {
  52. auto micros = duration_cast<microseconds_d>(duration);
  53. auto count = micros.count();
  54. sum += count;
  55. sqsum += count * count;
  56. }
  57. auto n = timings.size();
  58. Statistics stats;
  59. stats.mean = sum / n;
  60. stats.stddev = sqrt(sqsum / n - stats.mean * stats.mean);
  61. return stats;
  62. }