You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
3.2 KiB
136 lines
3.2 KiB
#include <fmt/core.h>
|
|
#include <string>
|
|
#include <fuc2/testing.hpp>
|
|
#include "stats.hpp"
|
|
#include "data.hpp"
|
|
#define SOL_ALL_SAFETIES_ON 1
|
|
#include <sol/sol.hpp>
|
|
|
|
using namespace fuc2;
|
|
|
|
namespace lua_perf_tests {
|
|
struct Samples {
|
|
std::vector<Stats> maos_many_for;
|
|
std::vector<Stats> 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>("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),
|
|
}
|
|
};
|
|
}
|
|
|