Commit ceb14f8c authored by cbruni's avatar cbruni Committed by Commit bot

[runtime] reduce runtime function and builtins overhead

All the counters, trace events and runtime call stats roughly create a 30%
overhead when calling into the runtime. This CL factors out the counters into
separate non-inlined functions. This way we can reduce the overhead to a
minimum and still have some useful stats without a compile-time flag.

BUG=chromium:596055
LOG=n

Review URL: https://codereview.chromium.org/1868513002

Cr-Commit-Position: refs/heads/master@{#35308}
parent 4b86e6e3
...@@ -79,22 +79,30 @@ double ClobberDoubleRegisters(double x1, double x2, double x3, double x4); ...@@ -79,22 +79,30 @@ double ClobberDoubleRegisters(double x1, double x2, double x3, double x4);
#define CLOBBER_DOUBLE_REGISTERS() #define CLOBBER_DOUBLE_REGISTERS()
#endif #endif
#define RUNTIME_FUNCTION_RETURNS_TYPE(Type, Name) \ // TODO(cbruni): add global flag to check whether any tracing events have been
static INLINE(Type __RT_impl_##Name(Arguments args, Isolate* isolate)); \ // enabled.
Type Name(int args_length, Object** args_object, Isolate* isolate) { \ #define RUNTIME_FUNCTION_RETURNS_TYPE(Type, Name) \
CLOBBER_DOUBLE_REGISTERS(); \ static INLINE(Type __RT_impl_##Name(Arguments args, Isolate* isolate)); \
Type value; \ \
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.runtime"), "V8." #Name); \ V8_NOINLINE static Type Stats_##Name(int args_length, Object** args_object, \
Arguments args(args_length, args_object); \ Isolate* isolate) { \
if (FLAG_runtime_call_stats) { \ RuntimeCallStats* stats = isolate->counters()->runtime_call_stats(); \
RuntimeCallStats* stats = isolate->counters()->runtime_call_stats(); \ RuntimeCallTimerScope timer(isolate, &stats->Name); \
RuntimeCallTimerScope timer(isolate, &stats->Name); \ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.runtime"), \
value = __RT_impl_##Name(args, isolate); \ "V8.Runtime_" #Name); \
} else { \ Arguments args(args_length, args_object); \
value = __RT_impl_##Name(args, isolate); \ return __RT_impl_##Name(args, isolate); \
} \ } \
return value; \ \
} \ Type Name(int args_length, Object** args_object, Isolate* isolate) { \
CLOBBER_DOUBLE_REGISTERS(); \
if (FLAG_runtime_call_stats) { \
return Stats_##Name(args_length, args_object, isolate); \
} \
Arguments args(args_length, args_object); \
return __RT_impl_##Name(args, isolate); \
} \
\
static Type __RT_impl_##Name(Arguments args, Isolate* isolate) static Type __RT_impl_##Name(Arguments args, Isolate* isolate)
#define RUNTIME_FUNCTION(Name) RUNTIME_FUNCTION_RETURNS_TYPE(Object*, Name) #define RUNTIME_FUNCTION(Name) RUNTIME_FUNCTION_RETURNS_TYPE(Object*, Name)
......
...@@ -138,25 +138,29 @@ BUILTIN_LIST_C(DEF_ARG_TYPE) ...@@ -138,25 +138,29 @@ BUILTIN_LIST_C(DEF_ARG_TYPE)
// //
// In the body of the builtin function the arguments can be accessed // In the body of the builtin function the arguments can be accessed
// through the BuiltinArguments object args. // through the BuiltinArguments object args.
// TODO(cbruni): add global flag to check whether any tracing events have been
// enabled.
#define BUILTIN(name) \ #define BUILTIN(name) \
MUST_USE_RESULT static Object* Builtin_Impl_##name(name##ArgumentsType args, \ MUST_USE_RESULT static Object* Builtin_Impl_##name(name##ArgumentsType args, \
Isolate* isolate); \ Isolate* isolate); \
MUST_USE_RESULT static Object* Builtin_##name( \ \
V8_NOINLINE static Object* Builtin_Impl_Stats_##name( \
int args_length, Object** args_object, Isolate* isolate) { \ int args_length, Object** args_object, Isolate* isolate) { \
Object* value; \ name##ArgumentsType args(args_length, args_object); \
isolate->counters()->runtime_calls()->Increment(); \ RuntimeCallStats* stats = isolate->counters()->runtime_call_stats(); \
RuntimeCallTimerScope timer(isolate, &stats->Builtin_##name); \
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.runtime"), \ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.runtime"), \
"V8.Builtin_" #name); \ "V8.Builtin_" #name); \
name##ArgumentsType args(args_length, args_object); \ return Builtin_Impl_##name(args, isolate); \
} \
\
MUST_USE_RESULT static Object* Builtin_##name( \
int args_length, Object** args_object, Isolate* isolate) { \
if (FLAG_runtime_call_stats) { \ if (FLAG_runtime_call_stats) { \
RuntimeCallStats* stats = isolate->counters()->runtime_call_stats(); \ return Builtin_Impl_Stats_##name(args_length, args_object, isolate); \
RuntimeCallTimerScope timer(isolate, &stats->Builtin_##name); \
value = Builtin_Impl_##name(args, isolate); \
} else { \
value = Builtin_Impl_##name(args, isolate); \
} \ } \
return value; \ name##ArgumentsType args(args_length, args_object); \
return Builtin_Impl_##name(args, isolate); \
} \ } \
\ \
MUST_USE_RESULT static Object* Builtin_Impl_##name(name##ArgumentsType args, \ MUST_USE_RESULT static Object* Builtin_Impl_##name(name##ArgumentsType args, \
...@@ -164,7 +168,6 @@ BUILTIN_LIST_C(DEF_ARG_TYPE) ...@@ -164,7 +168,6 @@ BUILTIN_LIST_C(DEF_ARG_TYPE)
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
#define CHECK_RECEIVER(Type, name, method) \ #define CHECK_RECEIVER(Type, name, method) \
if (!args.receiver()->Is##Type()) { \ if (!args.receiver()->Is##Type()) { \
THROW_NEW_ERROR_RETURN_FAILURE( \ THROW_NEW_ERROR_RETURN_FAILURE( \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment