From 8d0344a63615a02a90fd16c943977d83465d43c2 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 22 Jan 2024 21:51:12 +0100 Subject: [PATCH] LibJS: Avoid unnecessary MarkedVector in Bytecode::Op::Call::execute() perform_call() wants a ReadonlySpan, so just grab a slice of the current register window instead of making a MarkedVector. 10% speed-up on this function call microbenchmark: function callee(a, b, c) { } function caller(callee) { for (let i = 0; i < 10_000_000; ++i) callee(1, 2, 3) } caller(callee) --- Userland/Libraries/LibJS/Bytecode/Interpreter.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp b/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp index a07f3946d5..1de8d6d935 100644 --- a/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp +++ b/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp @@ -1000,7 +1000,6 @@ static ThrowCompletionOr dispatch_builtin_call(Bytecode::Interpreter& int ThrowCompletionOr Call::execute_impl(Bytecode::Interpreter& interpreter) const { - auto& vm = interpreter.vm(); auto callee = interpreter.reg(m_callee); TRY(throw_if_needed_for_call(interpreter, callee, call_type(), expression_string())); @@ -1010,12 +1009,7 @@ ThrowCompletionOr Call::execute_impl(Bytecode::Interpreter& interpreter) c return {}; } - MarkedVector argument_values(vm.heap()); - argument_values.ensure_capacity(m_argument_count); - for (u32 i = 0; i < m_argument_count; ++i) { - argument_values.unchecked_append(interpreter.reg(Register { m_first_argument.index() + i })); - } - interpreter.accumulator() = TRY(perform_call(interpreter, interpreter.reg(m_this_value), call_type(), callee, move(argument_values))); + interpreter.accumulator() = TRY(perform_call(interpreter, interpreter.reg(m_this_value), call_type(), callee, interpreter.registers().slice(m_first_argument.index(), m_argument_count))); return {}; }