X-Profiler / xprofiler

🌀An addon for node.js, which supporting output performance log and real-time profiling through sampling.
Other
430 stars 57 forks source link

optimize: take action #198

Closed hyj1991 closed 2 years ago

hyj1991 commented 2 years ago

背景

早期 1.x 版本在尚未实现 worker_threads 监控时,开发者的采样操作会通过 requestInterrupt & uv_async_send 同时通知js 主线程 —— 这意味着 HandleAction 在早期实现中会执行两次。

因此旧版实现中在 HandleAction 执行前校验了 TransactionDone 这个函数,通过 ${uuid}::${action} 的唯一 key 设置状态判断当前的 action 是否已经由 requestInterrupt or uv_async_send 执行过了,如果已经执行过,则清理 data 然后返回。

而在最新的实现中,将 HandleAction 放置到一个 lambda 回调中:

static void NotifyJsThread(EnvironmentData* env_data, void* data) {
  env_data->RequestInterrupt(
      [data](EnvironmentData* env_data, InterruptKind kind) {
        HandleAction(env_data->isolate(), data,
                     kind == InterruptKind::kBusy ? "v8_request_interrupt" : "uv_async_send");
      });
}

并且这个回调函数会放入每一个 EnvData 对应的 std:list 中,这样 requestInterrupt & uv_async_send 先触发的那一个会通过 std::list::swap 执行回调,后触发拿到的 std::list 为空不会再触发。

这样 HandleAction 只会执行一次,旧版本中设计的 TransactionDone 逻辑不再需要。

优化

移除当前实现中为 HandleAction 执行两次所做的冗余设计逻辑

codecov[bot] commented 2 years ago

Codecov Report

Merging #198 (9c9d333) into master (27f95d0) will not change coverage. The diff coverage is n/a.

@@            Coverage Diff            @@
##            master      #198   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            9         9           
  Lines          296       296           
=========================================
  Hits           296       296           

:mega: We’re building smart automated test selection to slash your CI/CD build times. Learn more