perftest.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #include <library/cpp/messagebus/rain_check/test/helper/misc.h>
  2. #include <library/cpp/messagebus/rain_check/core/rain_check.h>
  3. #include <util/datetime/base.h>
  4. #include <array>
  5. using namespace NRainCheck;
  6. static const unsigned SUBTASKS = 2;
  7. struct TRainCheckPerftestEnv: public TSimpleEnvTemplate<TRainCheckPerftestEnv> {
  8. unsigned SubtasksPerTask;
  9. TRainCheckPerftestEnv()
  10. : TSimpleEnvTemplate<TRainCheckPerftestEnv>(4)
  11. , SubtasksPerTask(1000)
  12. {
  13. }
  14. };
  15. struct TCoroOuter: public ICoroTask {
  16. TRainCheckPerftestEnv* const Env;
  17. TCoroOuter(TRainCheckPerftestEnv* env)
  18. : Env(env)
  19. {
  20. }
  21. void Run() override {
  22. for (;;) {
  23. TInstant start = TInstant::Now();
  24. unsigned count = 0;
  25. unsigned current = 1000;
  26. do {
  27. for (unsigned i = 0; i < current; ++i) {
  28. std::array<TSubtaskCompletion, SUBTASKS> completion;
  29. for (unsigned j = 0; j < SUBTASKS; ++j) {
  30. //SpawnSubtask<TNopSimpleTask>(Env, &completion[j]);
  31. //SpawnSubtask<TSpawnNopTasksCoroTask>(Env, &completion[j], SUBTASKS);
  32. SpawnSubtask<TSpawnNopTasksSimpleTask>(Env, &completion[j], SUBTASKS);
  33. }
  34. WaitForSubtasks();
  35. }
  36. count += current;
  37. current *= 2;
  38. } while (TInstant::Now() - start < TDuration::Seconds(1));
  39. TDuration d = TInstant::Now() - start;
  40. unsigned dns = d.NanoSeconds() / count;
  41. Cerr << dns << "ns per spawn/join\n";
  42. }
  43. }
  44. };
  45. struct TSimpleOuter: public ISimpleTask {
  46. TRainCheckPerftestEnv* const Env;
  47. TSimpleOuter(TRainCheckPerftestEnv* env, const void*)
  48. : Env(env)
  49. {
  50. }
  51. TInstant StartInstant;
  52. unsigned Count;
  53. unsigned Current;
  54. unsigned I;
  55. TContinueFunc Start() override {
  56. StartInstant = TInstant::Now();
  57. Count = 0;
  58. Current = 1000;
  59. I = 0;
  60. return &TSimpleOuter::Spawn;
  61. }
  62. std::array<TSubtaskCompletion, SUBTASKS> Completion;
  63. TContinueFunc Spawn() {
  64. for (unsigned j = 0; j < SUBTASKS; ++j) {
  65. //SpawnSubtask<TNopSimpleTask>(Env, &Completion[j]);
  66. //SpawnSubtask<TSpawnNopTasksCoroTask>(Env, &Completion[j], SUBTASKS);
  67. SpawnSubtask<TSpawnNopTasksSimpleTask>(Env, &Completion[j], SUBTASKS);
  68. }
  69. return &TSimpleOuter::Join;
  70. }
  71. TContinueFunc Join() {
  72. I += 1;
  73. if (I != Current) {
  74. return &TSimpleOuter::Spawn;
  75. }
  76. I = 0;
  77. Count += Current;
  78. Current *= 2;
  79. TDuration d = TInstant::Now() - StartInstant;
  80. if (d < TDuration::Seconds(1)) {
  81. return &TSimpleOuter::Spawn;
  82. }
  83. unsigned dns = d.NanoSeconds() / Count;
  84. Cerr << dns << "ns per spawn/join\n";
  85. return &TSimpleOuter::Start;
  86. }
  87. };
  88. struct TReproduceCrashTask: public ISimpleTask {
  89. TRainCheckPerftestEnv* const Env;
  90. TReproduceCrashTask(TRainCheckPerftestEnv* env)
  91. : Env(env)
  92. {
  93. }
  94. std::array<TSubtaskCompletion, SUBTASKS> Completion;
  95. TContinueFunc Start() override {
  96. for (unsigned j = 0; j < 2; ++j) {
  97. //SpawnSubtask<TNopSimpleTask>(Env, &Completion[j]);
  98. SpawnSubtask<TSpawnNopTasksSimpleTask>(Env, &Completion[j], SUBTASKS);
  99. }
  100. return &TReproduceCrashTask::Start;
  101. }
  102. };
  103. int main(int argc, char** argv) {
  104. Y_UNUSED(argc);
  105. Y_UNUSED(argv);
  106. TRainCheckPerftestEnv env;
  107. env.SpawnTask<TSimpleOuter>("");
  108. //env.SpawnTask<TCoroOuter>();
  109. //env.SpawnTask<TReproduceCrashTask>();
  110. for (;;) {
  111. Sleep(TDuration::Hours(1));
  112. }
  113. return 0;
  114. }