benchmark_seams.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #include <catch2/catch.hpp>
  2. #include "test_data.hpp"
  3. #include "libslic3r/GCode/SeamGeometry.hpp"
  4. #include "libslic3r/GCode/SeamAligned.hpp"
  5. #include "libslic3r/GCode/SeamRear.hpp"
  6. #include "libslic3r/GCode/SeamRandom.hpp"
  7. TEST_CASE_METHOD(Slic3r::Test::SeamsFixture, "Seam benchmarks", "[Seams][.Benchmarks]") {
  8. BENCHMARK_ADVANCED("Create extrusions benchy")(Catch::Benchmark::Chronometer meter) {
  9. meter.measure([&] { return Slic3r::Seams::Geometry::get_extrusions(print_object->layers()); });
  10. };
  11. using namespace Slic3r::Seams;
  12. BENCHMARK_ADVANCED("Create shells benchy")(Catch::Benchmark::Chronometer meter) {
  13. std::vector<Perimeters::LayerPerimeters> inputs;
  14. inputs.reserve(meter.runs());
  15. std::generate_n(std::back_inserter(inputs), meter.runs(), [&]() {
  16. return Slic3r::Seams::Perimeters::create_perimeters(
  17. projected, layer_infos, painting, params.perimeter
  18. );
  19. });
  20. meter.measure([&](const int i) {
  21. return Shells::create_shells(std::move(inputs[i]), params.max_distance);
  22. });
  23. };
  24. BENCHMARK_ADVANCED("Get layer infos benchy")(Catch::Benchmark::Chronometer meter) {
  25. meter.measure([&] {
  26. return Perimeters::get_layer_infos(
  27. print_object->layers(), params.perimeter.elephant_foot_compensation
  28. );
  29. });
  30. };
  31. BENCHMARK_ADVANCED("Create perimeters benchy")(Catch::Benchmark::Chronometer meter) {
  32. meter.measure([&] {
  33. return Perimeters::create_perimeters(projected, layer_infos, painting, params.perimeter);
  34. });
  35. };
  36. BENCHMARK_ADVANCED("Generate aligned seam benchy")(Catch::Benchmark::Chronometer meter) {
  37. std::vector<Shells::Shells<>> inputs;
  38. inputs.reserve(meter.runs());
  39. std::generate_n(std::back_inserter(inputs), meter.runs(), [&]() {
  40. Slic3r::Seams::Perimeters::LayerPerimeters perimeters{
  41. Slic3r::Seams::Perimeters::create_perimeters(
  42. projected, layer_infos, painting, params.perimeter
  43. )};
  44. return Shells::create_shells(
  45. std::move(perimeters), params.max_distance
  46. );
  47. });
  48. meter.measure([&](const int i) {
  49. return Aligned::get_object_seams(
  50. std::move(inputs[i]), visibility_calculator, params.aligned
  51. );
  52. });
  53. };
  54. BENCHMARK_ADVANCED("Visibility constructor")(Catch::Benchmark::Chronometer meter) {
  55. using Visibility = Slic3r::ModelInfo::Visibility;
  56. std::vector<Catch::Benchmark::storage_for<Visibility>> storage(meter.runs());
  57. meter.measure([&](const int i) {
  58. storage[i].construct(transformation, volumes, params.visibility, []() {});
  59. });
  60. };
  61. BENCHMARK_ADVANCED("Generate rear seam benchy")(Catch::Benchmark::Chronometer meter) {
  62. std::vector<Perimeters::LayerPerimeters> inputs;
  63. inputs.reserve(meter.runs());
  64. std::generate_n(std::back_inserter(inputs), meter.runs(), [&]() {
  65. return Slic3r::Seams::Perimeters::create_perimeters(
  66. projected, layer_infos, painting, params.perimeter
  67. );
  68. });
  69. meter.measure([&](const int i) {
  70. return Rear::get_object_seams(std::move(inputs[i]), params.rear_tolerance, params.rear_y_offset);
  71. });
  72. };
  73. BENCHMARK_ADVANCED("Generate random seam benchy")(Catch::Benchmark::Chronometer meter) {
  74. std::vector<Perimeters::LayerPerimeters> inputs;
  75. inputs.reserve(meter.runs());
  76. std::generate_n(std::back_inserter(inputs), meter.runs(), [&]() {
  77. return Slic3r::Seams::Perimeters::create_perimeters(
  78. projected, layer_infos, painting, params.perimeter
  79. );
  80. });
  81. meter.measure([&](const int i) {
  82. return Random::get_object_seams(std::move(inputs[i]), params.random_seed);
  83. });
  84. };
  85. Placer placer;
  86. BENCHMARK_ADVANCED("Init seam placer aligned")(Catch::Benchmark::Chronometer meter) {
  87. meter.measure([&] {
  88. return placer.init(print->objects(), params, [](){});
  89. });
  90. };
  91. SECTION("Place seam"){
  92. using namespace Slic3r;
  93. Placer placer;
  94. placer.init(print->objects(), params, [](){});
  95. std::vector<std::pair<const Layer*, const ExtrusionLoop*>> loops;
  96. const PrintObject* object{print->objects().front()};
  97. for (const Layer* layer :object->layers()) {
  98. for (const LayerSlice& lslice : layer->lslices_ex) {
  99. for (const LayerIsland &island : lslice.islands) {
  100. const LayerRegion &layer_region = *layer->get_region(island.perimeters.region());
  101. for (uint32_t perimeter_id : island.perimeters) {
  102. const auto *entity_collection{static_cast<const ExtrusionEntityCollection*>(layer_region.perimeters().entities[perimeter_id])};
  103. if (entity_collection != nullptr) {
  104. for (const ExtrusionEntity *entity : *entity_collection) {
  105. const auto loop{static_cast<const ExtrusionLoop*>(entity)};
  106. if (loop == nullptr) {
  107. continue;
  108. }
  109. loops.emplace_back(layer, loop);
  110. }
  111. }
  112. }
  113. }
  114. }
  115. }
  116. BENCHMARK_ADVANCED("Place seam benchy")(Catch::Benchmark::Chronometer meter) {
  117. meter.measure([&] {
  118. for (const auto &[layer, loop] : loops) {
  119. placer.place_seam(layer, *loop, {0, 0});
  120. }
  121. });
  122. };
  123. }
  124. }