#include #include #include #include "stats.hpp" #include "data.hpp" #define SOL_ALL_SAFETIES_ON 1 #include using namespace fuc2; namespace lua_perf_tests { struct Samples { std::vector maos_many_for; std::vector lua_many_for; }; void test_maos_performance(Samples& samples, int sample_size, int sample_number) { auto maos = new MultipleAOS(); for(int i = 0; i < sample_size; i++) { maos->push_back(i); } Stats maos_many_for; for(int sample = 0; sample < sample_number; sample++) { auto start = maos_many_for.time_start(); for(auto& el : maos->s1) { el.a01 += el.a02 + sample; el.a02 += el.a03 + sample; el.a03 += el.a04 + sample; } for(auto& el : maos->s2) { el.a05 += el.a06 + sample; el.a06 += el.a07 + sample; el.a07 += el.a08 + sample; } for(auto& el : maos->s3) { el.a09 += el.a10 + sample; el.a10 += el.a11 + sample; el.a11 += el.a12 + sample; } for(auto& el : maos->s4) { el.a13 += el.a14 + sample; el.a14 += el.a15 + sample; el.a15 += el.a16 + sample; } for(auto& el : maos->s5) { el.a17 += el.a18 + sample; el.a18 += el.a19 + sample; el.a19 += el.a20 + sample; } maos_many_for.sample_time(start); } samples.maos_many_for.push_back(maos_many_for); } void test_lua_maos_perf(Samples& samples, int sample_size, int sample_number) { sol::state lua; lua.open_libraries(sol::lib::base); auto maos = new MultipleAOS(); for(int i = 0; i < sample_size; i++) { maos->push_back(i); } // setup lua for MOAS lua.new_usertype("S1", "a01", &S1::a01, "a02", &S1::a02, "a03", &S1::a03, "a04", &S1::a04); lua.script(R"( function effed_handler(v, size, sample) for i = 1,size,1 do v[i].a01 = v[i].a01 + v[i].a02 + sample v[i].a02 = v[i].a02 + v[i].a03 + sample v[i].a03 = v[i].a03 + v[i].a04 + sample end end function handler(v, sample) v.a01 = v.a01 + v.a02 + sample v.a02 = v.a02 + v.a03 + sample v.a03 = v.a03 + v.a04 + sample end )"); sol::function handler = lua["handler"]; Stats lua_many_for; for(int sample = 0; sample < sample_number; sample++) { auto start = lua_many_for.time_start(); for(auto& el : maos->s1) { handler(el, sample); } lua_many_for.sample_time(start); } samples.lua_many_for.push_back(lua_many_for); } void test_all_performance() { Samples samples; int sample_size = 100; int sample_count = 100; for(int i = 0; i < 10; i++) { test_maos_performance(samples, sample_size, sample_count); test_lua_maos_perf(samples, sample_size, sample_count); } for(size_t i = 0; i < samples.maos_many_for.size(); i++) { fmt::println("{:.2f} {:.2f}", samples.maos_many_for[i].mean(), samples.lua_many_for[i].mean()); } } fuc2::Set TESTS{ .name="lua_perf", .tests={ TEST(test_all_performance), } }; }