diff --git a/ReactCommon/cxxreact/JSCPerfStats.cpp b/ReactCommon/cxxreact/JSCPerfStats.cpp index 8f3e0d6b2d9..f1f487569f7 100644 --- a/ReactCommon/cxxreact/JSCPerfStats.cpp +++ b/ReactCommon/cxxreact/JSCPerfStats.cpp @@ -4,12 +4,43 @@ #ifdef JSC_HAS_PERF_STATS_API +#include + +#include +#include + #include #include #include using namespace facebook::react; +static uint64_t toMillis(struct timeval tv) { + return tv.tv_sec * 1000ULL + tv.tv_usec / 1000ULL; +} + +static JSValueRef nativeGetProcessPerfStats( + JSContextRef ctx, + JSObjectRef function, + JSObjectRef thisObject, + size_t argumentCount, + const JSValueRef arguments[], + JSValueRef* exception) { + struct rusage usage{}; + if (getrusage(RUSAGE_SELF, &usage) != 0) { + return Value::makeUndefined(ctx); + } + + auto result = Object::create(ctx); + uint64_t cpu_time_ms = toMillis(usage.ru_utime) + toMillis(usage.ru_stime); + result.setProperty("major_faults", Value::makeNumber(ctx, usage.ru_majflt)); + result.setProperty("minor_faults", Value::makeNumber(ctx, usage.ru_minflt)); + result.setProperty("cpu_time_ms", Value::makeNumber(ctx, cpu_time_ms)); + result.setProperty("input_blocks", Value::makeNumber(ctx, usage.ru_inblock)); + result.setProperty("output_blocks", Value::makeNumber(ctx, usage.ru_oublock)); + return static_cast(result); +} + static JSValueRef nativeGetHeapStats( JSContextRef ctx, JSObjectRef function, @@ -55,6 +86,7 @@ namespace react { void addJSCPerfStatsHooks(JSGlobalContextRef ctx) { #ifdef JSC_HAS_PERF_STATS_API + installGlobalFunction(ctx, "nativeGetProcessPerfStats", nativeGetProcessPerfStats); installGlobalFunction(ctx, "nativeGetHeapStats", nativeGetHeapStats); installGlobalFunction(ctx, "nativeGetGCStats", nativeGetGCStats); #endif