Changeset View
Changeset View
Standalone View
Standalone View
src/tests/client/maybe-add-save-events-trigger-benchmark-test.cpp
- This file was added.
| /* | |||||
| * This file is part of libkazv. | |||||
| * SPDX-FileCopyrightText: 2025 tusooa <tusooa@kazv.moe> | |||||
| * SPDX-License-Identifier: AGPL-3.0-or-later | |||||
| */ | |||||
| #include <libkazv-config.hpp> | |||||
| #include "factory.hpp" | |||||
| #include <client-model.hpp> | |||||
| #include <zug/transducer/repeat.hpp> | |||||
| #include <catch2/catch_test_macros.hpp> | |||||
| #include <catch2/benchmark/catch_benchmark.hpp> | |||||
| #include <iostream> | |||||
| using namespace Kazv; | |||||
| using namespace Kazv::Factory; | |||||
| static auto generateChanges(std::size_t newCount, std::size_t changedCount, const EventList &events) | |||||
| { | |||||
| return intoImmer( | |||||
| EventList{}, | |||||
| zug::repeatn(newCount, 0) | |||||
| | zug::map([](auto &&) { | |||||
| return makeEvent(); | |||||
| }) | |||||
| ) + intoImmer( | |||||
| EventList{}, | |||||
| zug::take(changedCount) | |||||
| | zug::map([](auto &&e) { | |||||
| return makeEvent(withEventId(e.id()) | withEventContent(json{{"mew", "mew"}})); | |||||
| }), | |||||
| events | |||||
| ); | |||||
| } | |||||
| // Assumption is that new/changed messages take only a small part in the whole room. | |||||
| static std::pair<ClientModel, ClientModel> data( | |||||
| std::size_t roomCount, | |||||
| std::size_t timelineMessagesPerRoom, | |||||
| std::size_t nonTimelineMessagesPerRoom, | |||||
| std::size_t newTimelineMessagesPerRoom, | |||||
| std::size_t newNonTimelineMessagesPerRoom, | |||||
| std::size_t changedTimelineMessagesPerRoom, | |||||
| std::size_t changedNonTimelineMessagesPerRoom | |||||
| ) | |||||
| { | |||||
| std::cerr << "Generating data" << std::endl; | |||||
| auto old = makeClient(); | |||||
| auto client = makeClient(); | |||||
| std::size_t generated = 0; | |||||
| for (std::size_t r = 0; r < roomCount; ++r) { | |||||
| auto room = makeRoom(); | |||||
| auto events = EventList{}; | |||||
| for (std::size_t m = 0; m < timelineMessagesPerRoom; ++m) { | |||||
| auto event = makeEvent(); | |||||
| events = std::move(events).push_back(event); | |||||
| ++generated; | |||||
| if (generated % 10000 == 0) { | |||||
| std::cerr << "Generated " << generated << " events" << std::endl; | |||||
| } | |||||
| } | |||||
| withRoomTimeline(events)(room); | |||||
| auto origNonTl = EventList{}; | |||||
| for (std::size_t m = 0; m < nonTimelineMessagesPerRoom; ++m) { | |||||
| auto event = makeEvent(); | |||||
| events = std::move(events).push_back(event); | |||||
| ++generated; | |||||
| if (generated % 10000 == 0) { | |||||
| std::cerr << "Generated " << generated << " events" << std::endl; | |||||
| } | |||||
| } | |||||
| room = RoomModel::update(std::move(room), AddMessagesAction{origNonTl}); | |||||
| withRoom(room)(old); | |||||
| auto tl = generateChanges(newTimelineMessagesPerRoom, changedTimelineMessagesPerRoom, events); | |||||
| auto nonTl = generateChanges(newNonTimelineMessagesPerRoom, changedNonTimelineMessagesPerRoom, origNonTl); | |||||
| withRoomTimeline(tl)(room); | |||||
| room = RoomModel::update(std::move(room), AddMessagesAction{nonTl}); | |||||
| withRoom(room)(client); | |||||
| } | |||||
| return {old, client}; | |||||
| } | |||||
| TEST_CASE("maybeAddSaveEventsTrigger() benchmark: small", "[client][storage-actions][!benchmark]") | |||||
| { | |||||
| auto [old, client] = data(10, 200, 100, 5, 5, 2, 2); | |||||
| BENCHMARK("maybeAddSaveEventsTrigger()") { | |||||
| return client.maybeAddSaveEventsTrigger(old); | |||||
| }; | |||||
| } | |||||
| TEST_CASE("maybeAddSaveEventsTrigger() benchmark: medium", "[client][storage-actions][!benchmark]") | |||||
| { | |||||
| auto [old, client] = data(50, 1000, 200, 10, 10, 5, 5); | |||||
| BENCHMARK("maybeAddSaveEventsTrigger()") { | |||||
| return client.maybeAddSaveEventsTrigger(old); | |||||
| }; | |||||
| } | |||||
| // unprobable case: all 100 rooms have 80 events added/changed during 1 sync | |||||
| TEST_CASE("maybeAddSaveEventsTrigger() benchmark: large", "[client][storage-actions][!benchmark]") | |||||
| { | |||||
| auto [old, client] = data(100, 4000, 400, 20, 20, 20, 20); | |||||
| BENCHMARK("maybeAddSaveEventsTrigger()") { | |||||
| return client.maybeAddSaveEventsTrigger(old); | |||||
| }; | |||||
| } | |||||
| // unprobable case: all 500 rooms have 20 events added/changed during 1 sync | |||||
| TEST_CASE("maybeAddSaveEventsTrigger() benchmark: many rooms with few events", "[client][storage-actions][!benchmark]") | |||||
| { | |||||
| auto [old, client] = data(500, 200, 100, 5, 5, 5, 5); | |||||
| BENCHMARK("maybeAddSaveEventsTrigger()") { | |||||
| return client.maybeAddSaveEventsTrigger(old); | |||||
| }; | |||||
| } | |||||