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 {
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
// 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<TrafficData>(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<std::string, std::unique_ptr<TrafficData>> updated; // tag to diff
for (const auto &item: items) {
void TrafficLooper::UpdateAll() {
std::map<std::string, TrafficData *> 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;

View File

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

View File

@@ -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);