From a06c63a66c4fa0a38cee750f7fc28511249e2d1d Mon Sep 17 00:00:00 2001 From: arm64v8a <48624112+arm64v8a@users.noreply.github.com> Date: Thu, 24 Nov 2022 21:13:48 +0900 Subject: [PATCH] chore: optimize traffic looper --- db/TrafficLooper.cpp | 30 +++++++++++++++++------------- db/TrafficLooper.hpp | 12 +++++++----- ui/mainwindow_grpc.cpp | 4 ++-- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/db/TrafficLooper.cpp b/db/TrafficLooper.cpp index 57985ba..10b7aeb 100644 --- a/db/TrafficLooper.cpp +++ b/db/TrafficLooper.cpp @@ -8,12 +8,12 @@ namespace NekoRay::traffic { TrafficLooper *trafficLooper = new TrafficLooper; - QElapsedTimer trafficLooper_timer; + QElapsedTimer elapsedTimer; - std::unique_ptr TrafficLooper::update_stats(TrafficData *item) { + TrafficData *TrafficLooper::update_stats(TrafficData *item) { #ifndef NKR_NO_GRPC // last update - auto now = trafficLooper_timer.elapsed(); + auto now = elapsedTimer.elapsed(); auto interval = now - item->last_update; item->last_update = now; if (interval <= 0) return nullptr; @@ -29,7 +29,7 @@ namespace NekoRay::traffic { item->uplink_rate = uplink * 1000 / interval; // return diff - auto ret = std::make_unique(item->tag); + auto ret = new TrafficData(item->tag); ret->downlink = downlink; ret->uplink = uplink; ret->downlink_rate = item->downlink_rate; @@ -49,15 +49,15 @@ namespace NekoRay::traffic { #endif } - void TrafficLooper::update_all() { - std::map> updated; // tag to diff - for (const auto &item: items) { + void TrafficLooper::UpdateAll() { + std::map updated; // tag to diff + for (const auto &item: this->items) { auto data = item.get(); - auto diff = std::move(updated[data->tag]); + auto diff = updated[data->tag]; // 避免重复查询一个 outbound tag if (diff == nullptr) { diff = update_stats(data); - updated[data->tag] = std::move(diff); + updated[data->tag] = diff; } else { data->uplink += diff->uplink; data->downlink += diff->downlink; @@ -65,11 +65,15 @@ namespace NekoRay::traffic { data->downlink_rate = diff->downlink_rate; } } - update_stats(bypass); + updated[bypass->tag] = update_stats(bypass); + // + for (const auto &pair: updated) { + delete pair.second; + } } - void TrafficLooper::loop() { - trafficLooper_timer.start(); + void TrafficLooper::Loop() { + elapsedTimer.start(); while (true) { auto sleep_ms = dataStore->traffic_loop_interval; auto user_disabled = sleep_ms == 0; @@ -97,7 +101,7 @@ namespace NekoRay::traffic { // do update loop_mutex.lock(); - update_all(); + UpdateAll(); // do conn list update QJsonArray conn_list; diff --git a/db/TrafficLooper.hpp b/db/TrafficLooper.hpp index d72ce5b..2e55c52 100644 --- a/db/TrafficLooper.hpp +++ b/db/TrafficLooper.hpp @@ -15,16 +15,18 @@ namespace NekoRay::traffic { QMutex loop_mutex; QList> items; - TrafficData *bypass = new TrafficData("bypass"); TrafficData *proxy = nullptr; - static std::unique_ptr update_stats(TrafficData *item); + void UpdateAll(); - static QJsonArray get_connection_list(); + void Loop(); - void update_all(); + private: + TrafficData *bypass = new TrafficData("bypass"); - void loop(); + [[nodiscard]] static TrafficData *update_stats(TrafficData *item); + + [[nodiscard]] static QJsonArray get_connection_list(); }; extern TrafficLooper *trafficLooper; diff --git a/ui/mainwindow_grpc.cpp b/ui/mainwindow_grpc.cpp index f3b77be..28d1db3 100644 --- a/ui/mainwindow_grpc.cpp +++ b/ui/mainwindow_grpc.cpp @@ -43,7 +43,7 @@ void MainWindow::setup_grpc() { runOnUiThread([=] { t->start(2000); }, t); // Looper - runOnNewThread([=] { NekoRay::traffic::trafficLooper->loop(); }); + runOnNewThread([=] { NekoRay::traffic::trafficLooper->Loop(); }); #endif } @@ -271,7 +271,7 @@ void MainWindow::neko_stop(bool crash) { NekoRay::traffic::trafficLooper->loop_enabled = false; NekoRay::traffic::trafficLooper->loop_mutex.lock(); if (NekoRay::dataStore->traffic_loop_interval != 0) { - NekoRay::traffic::trafficLooper->update_all(); + NekoRay::traffic::trafficLooper->UpdateAll(); for (const auto &item: NekoRay::traffic::trafficLooper->items) { NekoRay::profileManager->GetProfile(item->id)->Save(); refresh_proxy_list(item->id);