chore: optimize traffic looper

This commit is contained in:
arm64v8a
2022-11-24 21:13:48 +09:00
parent 47d896e561
commit a06c63a66c
3 changed files with 26 additions and 20 deletions

View File

@@ -8,12 +8,12 @@
namespace NekoRay::traffic { namespace NekoRay::traffic {
TrafficLooper *trafficLooper = new TrafficLooper; TrafficLooper *trafficLooper = new TrafficLooper;
QElapsedTimer trafficLooper_timer; QElapsedTimer elapsedTimer;
std::unique_ptr<TrafficData> TrafficLooper::update_stats(TrafficData *item) { TrafficData *TrafficLooper::update_stats(TrafficData *item) {
#ifndef NKR_NO_GRPC #ifndef NKR_NO_GRPC
// last update // last update
auto now = trafficLooper_timer.elapsed(); auto now = elapsedTimer.elapsed();
auto interval = now - item->last_update; auto interval = now - item->last_update;
item->last_update = now; item->last_update = now;
if (interval <= 0) return nullptr; if (interval <= 0) return nullptr;
@@ -29,7 +29,7 @@ namespace NekoRay::traffic {
item->uplink_rate = uplink * 1000 / interval; item->uplink_rate = uplink * 1000 / interval;
// return diff // return diff
auto ret = std::make_unique<TrafficData>(item->tag); auto ret = new TrafficData(item->tag);
ret->downlink = downlink; ret->downlink = downlink;
ret->uplink = uplink; ret->uplink = uplink;
ret->downlink_rate = item->downlink_rate; ret->downlink_rate = item->downlink_rate;
@@ -49,15 +49,15 @@ namespace NekoRay::traffic {
#endif #endif
} }
void TrafficLooper::update_all() { void TrafficLooper::UpdateAll() {
std::map<std::string, std::unique_ptr<TrafficData>> updated; // tag to diff std::map<std::string, TrafficData *> updated; // tag to diff
for (const auto &item: items) { for (const auto &item: this->items) {
auto data = item.get(); auto data = item.get();
auto diff = std::move(updated[data->tag]); auto diff = updated[data->tag];
// 避免重复查询一个 outbound tag // 避免重复查询一个 outbound tag
if (diff == nullptr) { if (diff == nullptr) {
diff = update_stats(data); diff = update_stats(data);
updated[data->tag] = std::move(diff); updated[data->tag] = diff;
} else { } else {
data->uplink += diff->uplink; data->uplink += diff->uplink;
data->downlink += diff->downlink; data->downlink += diff->downlink;
@@ -65,11 +65,15 @@ namespace NekoRay::traffic {
data->downlink_rate = diff->downlink_rate; 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() { void TrafficLooper::Loop() {
trafficLooper_timer.start(); elapsedTimer.start();
while (true) { while (true) {
auto sleep_ms = dataStore->traffic_loop_interval; auto sleep_ms = dataStore->traffic_loop_interval;
auto user_disabled = sleep_ms == 0; auto user_disabled = sleep_ms == 0;
@@ -97,7 +101,7 @@ namespace NekoRay::traffic {
// do update // do update
loop_mutex.lock(); loop_mutex.lock();
update_all(); UpdateAll();
// do conn list update // do conn list update
QJsonArray conn_list; QJsonArray conn_list;

View File

@@ -15,16 +15,18 @@ namespace NekoRay::traffic {
QMutex loop_mutex; QMutex loop_mutex;
QList<QSharedPointer<TrafficData>> items; QList<QSharedPointer<TrafficData>> items;
TrafficData *bypass = new TrafficData("bypass");
TrafficData *proxy = nullptr; TrafficData *proxy = nullptr;
static std::unique_ptr<TrafficData> 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; extern TrafficLooper *trafficLooper;

View File

@@ -43,7 +43,7 @@ void MainWindow::setup_grpc() {
runOnUiThread([=] { t->start(2000); }, t); runOnUiThread([=] { t->start(2000); }, t);
// Looper // Looper
runOnNewThread([=] { NekoRay::traffic::trafficLooper->loop(); }); runOnNewThread([=] { NekoRay::traffic::trafficLooper->Loop(); });
#endif #endif
} }
@@ -271,7 +271,7 @@ void MainWindow::neko_stop(bool crash) {
NekoRay::traffic::trafficLooper->loop_enabled = false; NekoRay::traffic::trafficLooper->loop_enabled = false;
NekoRay::traffic::trafficLooper->loop_mutex.lock(); NekoRay::traffic::trafficLooper->loop_mutex.lock();
if (NekoRay::dataStore->traffic_loop_interval != 0) { if (NekoRay::dataStore->traffic_loop_interval != 0) {
NekoRay::traffic::trafficLooper->update_all(); NekoRay::traffic::trafficLooper->UpdateAll();
for (const auto &item: NekoRay::traffic::trafficLooper->items) { for (const auto &item: NekoRay::traffic::trafficLooper->items) {
NekoRay::profileManager->GetProfile(item->id)->Save(); NekoRay::profileManager->GetProfile(item->id)->Save();
refresh_proxy_list(item->id); refresh_proxy_list(item->id);