综合平台编程器项目的远程存储
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

124 line
3.5 KiB

  1. #include "domain/control_logic_model.h"
  2. #include "domain/register_repository.h"
  3. #include "domain/virtual_register_repository.h"
  4. #include "services/software_logic_executor.h"
  5. #include <QDebug>
  6. #include <QTest>
  7. #include <string>
  8. #include <utility>
  9. #include <vector>
  10. namespace
  11. {
  12. LogicNode contact(const std::string &id, int address)
  13. {
  14. return {id,
  15. ContactNodeConfig{
  16. RegisterAddress{RegisterArea::M, address},
  17. ContactMode::NormallyOpen},
  18. true};
  19. }
  20. LogicNode coil(const std::string &id, int address)
  21. {
  22. return {id,
  23. CoilNodeConfig{
  24. RegisterAddress{RegisterArea::M, address},
  25. CoilMode::Normal},
  26. true};
  27. }
  28. ControlLogic makeLogic(int index)
  29. {
  30. LadderRung rung;
  31. rung.id = "rung-" + std::to_string(index);
  32. rung.name = rung.id;
  33. ConditionExpression condition;
  34. condition.id = "series-" + std::to_string(index);
  35. condition.kind = ConditionExpressionKind::Series;
  36. condition.children = {
  37. ConditionExpression::fromNode(
  38. contact("contact-" + std::to_string(index), index)),
  39. ConditionExpression::fromWire(
  40. "wire-" + std::to_string(index), 9)};
  41. rung.condition = std::move(condition);
  42. rung.output = coil("coil-" + std::to_string(index), index + 100);
  43. return {"logic-" + std::to_string(index),
  44. "logic-" + std::to_string(index),
  45. {rung},
  46. true};
  47. }
  48. class PerformanceTests final : public QObject
  49. {
  50. Q_OBJECT
  51. private slots:
  52. void initTestCase()
  53. {
  54. qInfo().noquote()
  55. << QStringLiteral("性能测试开始:下面两项 RESULT 的耗时均为平均每次执行时间");
  56. qInfo().noquote()
  57. << QStringLiteral("测试项目 1:100 个控制逻辑的软件扫描");
  58. qInfo().noquote()
  59. << QStringLiteral("测试项目 2:M0 到 M4000 共 4001 个虚拟 M 地址的完整写入和读取");
  60. }
  61. void softwareExecutor_scansRepresentativeProject()
  62. {
  63. std::vector<ControlLogic> logics;
  64. logics.reserve(100);
  65. for (int index = 0; index < 100; ++index)
  66. {
  67. logics.push_back(makeLogic(index));
  68. }
  69. SoftwareLogicExecutor executor;
  70. VirtualRegisterRepository repository;
  71. QVERIFY(executor.validate(logics).succeeded);
  72. QVERIFY(executor.executeScan(logics, repository).succeeded);
  73. QBENCHMARK
  74. {
  75. executor.executeScan(logics, repository);
  76. }
  77. }
  78. void virtualRepository_handlesBoundaryWorkload()
  79. {
  80. VirtualRegisterRepository repository;
  81. for (int index = 0; index <= RegisterAddress::kMaximumIndex; ++index)
  82. {
  83. QVERIFY(repository.writeBit(
  84. {RegisterArea::M, index}, (index % 2) == 0)
  85. .succeeded);
  86. QVERIFY(repository.readBit({RegisterArea::M, index}).succeeded);
  87. }
  88. QBENCHMARK
  89. {
  90. for (int index = 0; index <= RegisterAddress::kMaximumIndex; ++index)
  91. {
  92. repository.writeBit(
  93. {RegisterArea::M, index}, (index % 2) == 0);
  94. repository.readBit({RegisterArea::M, index});
  95. }
  96. }
  97. }
  98. void cleanupTestCase()
  99. {
  100. qInfo().noquote()
  101. << QStringLiteral("性能测试结束:请结合上方两项 RESULT 和最后的 Totals 判断结果");
  102. }
  103. };
  104. } // namespace
  105. QTEST_APPLESS_MAIN(PerformanceTests)
  106. #include "performance_tests.moc"