Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions Benchmarks/benchmark_common.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,37 @@ struct SharedObject : std::enable_shared_from_this<SharedObject>
}
};

struct Vec3Source
{
float x = 0.f, y = 0.f, z = 0.f;
Vec3Source() = default;
Vec3Source(float x_, float y_, float z_) : x(x_), y(y_), z(z_) {}
};

struct Vec3Target
{
float x = 0.f, y = 0.f, z = 0.f;
Vec3Target() = default;
Vec3Target(float x_, float y_, float z_) : x(x_), y(y_), z(z_) {}
};

struct ColorSource
{
float r = 0.f, g = 0.f, b = 0.f;
ColorSource() = default;
ColorSource(float r_, float g_, float b_) : r(r_), g(g_), b(b_) {}
};

inline float sumVec3(Vec3Target v)
{
return v.x + v.y + v.z;
}

inline float sumVec3Ref(const Vec3Target& v)
{
return v.x + v.y + v.z;
}

inline Basic* basic_return()
{
static Basic value{};
Expand Down
4 changes: 2 additions & 2 deletions Benchmarks/benchmark_luabridge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ void multi_return_measure(benchmark::State& state)
setSkipped(state, "unsupported conceptual multi-return conversion in LuaBridge vanilla");
}

void base_derived_measure(benchmark::State& state)
void derived_base_measure(benchmark::State& state)
{
setSkipped(state, "unsupported for multi inheritance in LuaBridge vanilla");
}
Expand Down Expand Up @@ -498,7 +498,7 @@ BENCHMARK(userdata_variable_access_last_measure)->Name("userdata_variable_access
BENCHMARK(multi_return_lua_measure)->Name("multi_return_lua_measure");
BENCHMARK(multi_return_measure)->Name("multi_return_measure");
BENCHMARK(stateful_function_object_measure)->Name("stateful_function_object_measure");
BENCHMARK(base_derived_measure)->Name("base_derived_measure");
BENCHMARK(derived_base_measure)->Name("derived_base_measure");
BENCHMARK(return_userdata_measure)->Name("return_userdata_measure");
BENCHMARK(optional_success_measure)->Name("optional_success_measure");
BENCHMARK(optional_half_failure_measure)->Name("optional_half_failure_measure");
Expand Down
118 changes: 116 additions & 2 deletions Benchmarks/benchmark_luabridge3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,34 @@
#include <cmath>
#include <tuple>

namespace luabridge {

template <>
struct StackConversion<lbsbench::Vec3Target>
{
static constexpr bool enabled = true;
};

template <>
struct StackConverter<lbsbench::Vec3Target, lbsbench::Vec3Source>
{
static lbsbench::Vec3Target convert(const lbsbench::Vec3Source& s)
{
return {s.x, s.y, s.z};
}
};

template <>
struct StackConverter<lbsbench::Vec3Target, lbsbench::ColorSource>
{
static lbsbench::Vec3Target convert(const lbsbench::ColorSource& s)
{
return {s.r, s.g, s.b};
}
};

} // namespace luabridge

namespace {

using namespace lbsbench;
Expand Down Expand Up @@ -396,7 +424,7 @@ void multi_return_measure(benchmark::State& state)
benchmark::DoNotOptimize(x);
}

void base_derived_measure(benchmark::State& state)
void derived_base_measure(benchmark::State& state)
{
lua_State* L = makeLua();

Expand Down Expand Up @@ -657,6 +685,88 @@ void implicit_inheritance_measure(benchmark::State& state)
}
}

void registerConverter(lua_State* L)
{
luabridge::getGlobalNamespace(L)
.beginClass<Vec3Source>("Vec3Source")
.addConstructor<void(float, float, float)>()
.addConverter<Vec3Target>()
.endClass()
.beginClass<ColorSource>("ColorSource")
.addConstructor<void(float, float, float)>()
.addConverter<Vec3Target>()
.endClass()
.beginClass<Vec3Target>("Vec3Target")
.addConstructor<void(float, float, float)>()
.endClass()
.addFunction("sumVec3", &sumVec3)
.addFunction("sumVec3Ref", &sumVec3Ref);
}

void converter_exact_type_measure(benchmark::State& state)
{
lua_State* L = makeLua();
registerConverter(L);
luaDoStringOrThrow(L, "obj = Vec3Target(1, 2, 3)", "converter_exact_type setup");
luaDoStringOrThrow(L, "function invoke_exact() return sumVec3(obj) end", "converter_exact_type closure setup");

for (auto _ : state)
{
(void) _;
lua_getglobal(L, "invoke_exact");
luaCheckOrThrow(L, lua_pcall(L, 0, 1, 0), "invoke_exact");
lua_pop(L, 1);
}
}

void converter_phase3_value_measure(benchmark::State& state)
{
lua_State* L = makeLua();
registerConverter(L);
luaDoStringOrThrow(L, "obj = Vec3Source(1, 2, 3)", "converter_phase3_value setup");
luaDoStringOrThrow(L, "function invoke_conv_value() return sumVec3(obj) end", "converter_phase3_value closure setup");

for (auto _ : state)
{
(void) _;
lua_getglobal(L, "invoke_conv_value");
luaCheckOrThrow(L, lua_pcall(L, 0, 1, 0), "invoke_conv_value");
lua_pop(L, 1);
}
}

void converter_phase3_ref_measure(benchmark::State& state)
{
lua_State* L = makeLua();
registerConverter(L);
luaDoStringOrThrow(L, "obj = Vec3Source(1, 2, 3)", "converter_phase3_ref setup");
luaDoStringOrThrow(L, "function invoke_conv_ref() return sumVec3Ref(obj) end", "converter_phase3_ref closure setup");

for (auto _ : state)
{
(void) _;
lua_getglobal(L, "invoke_conv_ref");
luaCheckOrThrow(L, lua_pcall(L, 0, 1, 0), "invoke_conv_ref");
lua_pop(L, 1);
}
}

void converter_multi_registered_measure(benchmark::State& state)
{
lua_State* L = makeLua();
registerConverter(L);
luaDoStringOrThrow(L, "obj = ColorSource(0.5, 1, 0)", "converter_multi_registered setup");
luaDoStringOrThrow(L, "function invoke_conv_multi() return sumVec3(obj) end", "converter_multi_registered closure setup");

for (auto _ : state)
{
(void) _;
lua_getglobal(L, "invoke_conv_multi");
luaCheckOrThrow(L, lua_pcall(L, 0, 1, 0), "invoke_conv_multi");
lua_pop(L, 1);
}
}

} // namespace

BENCHMARK(table_global_string_get_measure)->Name("table_global_string_get_measure");
Expand All @@ -675,7 +785,7 @@ BENCHMARK(userdata_variable_access_last_measure)->Name("userdata_variable_access
BENCHMARK(multi_return_lua_measure)->Name("multi_return_lua_measure");
BENCHMARK(multi_return_measure)->Name("multi_return_measure");
BENCHMARK(stateful_function_object_measure)->Name("stateful_function_object_measure");
BENCHMARK(base_derived_measure)->Name("base_derived_measure");
BENCHMARK(derived_base_measure)->Name("derived_base_measure");
BENCHMARK(return_userdata_measure)->Name("return_userdata_measure");
BENCHMARK(optional_success_measure)->Name("optional_success_measure");
BENCHMARK(optional_half_failure_measure)->Name("optional_half_failure_measure");
Expand All @@ -689,3 +799,7 @@ BENCHMARK(shared_ptr_return_measure)->Name("shared_ptr_return_measure");
BENCHMARK(shared_ptr_pass_measure)->Name("shared_ptr_pass_measure");
BENCHMARK(static_member_function_call_measure)->Name("static_member_function_call_measure");
BENCHMARK(derived_method_call_measure)->Name("derived_method_call_measure");
BENCHMARK(converter_exact_type_measure)->Name("converter_exact_type_measure");
BENCHMARK(converter_phase3_value_measure)->Name("converter_phase3_value_measure");
BENCHMARK(converter_phase3_ref_measure)->Name("converter_phase3_ref_measure");
BENCHMARK(converter_multi_registered_measure)->Name("converter_multi_registered_measure");
4 changes: 2 additions & 2 deletions Benchmarks/benchmark_sol3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -348,7 +348,7 @@ void multi_return_measure(benchmark::State& state)
benchmark::DoNotOptimize(x);
}

void base_derived_measure(benchmark::State& state)
void derived_base_measure(benchmark::State& state)
{
sol::state lua;

Expand Down Expand Up @@ -602,7 +602,7 @@ BENCHMARK(userdata_variable_access_last_measure)->Name("userdata_variable_access
BENCHMARK(multi_return_lua_measure)->Name("multi_return_lua_measure");
BENCHMARK(multi_return_measure)->Name("multi_return_measure");
BENCHMARK(stateful_function_object_measure)->Name("stateful_function_object_measure");
BENCHMARK(base_derived_measure)->Name("base_derived_measure");
BENCHMARK(derived_base_measure)->Name("derived_base_measure");
BENCHMARK(return_userdata_measure)->Name("return_userdata_measure");
BENCHMARK(optional_success_measure)->Name("optional_success_measure");
BENCHMARK(optional_half_failure_measure)->Name("optional_half_failure_measure");
Expand Down
Loading
Loading