Используя C, имея
typedef struct Entity {
size_t id;
char *luaFun;
} Entity;
и вызывая
void LuaEntityUpdate(Entity *entity, double dt) {
lua_getglobal(L, entity->luaFun);
lua_pushinteger(L, entity->id);
lua_pushnumber(L, dt);
lua_call(L, 2, 0);
}
в глобальный (entity-> luaFun = "entity_update")
function entity_update(id, dt)
print("Entity updated ", id, " ", dt)
end
вцикл (одиночный фрейм игры) занимает около:
- 0,2 секунды для 128 сущностей, использующих Windows *
- 0,2 секунды для 8096 сущностей, использующихLinux **
, что делает сборку Windows примерно в 64 раза медленнее, чем в Linux (на той же машине запущенные приложения сокращены до минимума, причем оба используют одно ядро).
Чтоможет быть причиной такой огромной разницы? Пожалуйста, смотрите комментарии и редактируйте ниже.
* Windows 10, Mingw-w64, из: "MingW-W64-builds", с использованием бинарных выпусков Lua 5.3.5
** Mint 16, gcc, Lua 5.3.5 build из официальных источников
- EDIT
Как и предлагалось в комментариях, я пытался измерить производительность без печатилюбые сообщения и бинго!Без какой-либо производительности печати почти соответствует сборке Linux.
Теперь я попытался заменить печать на:
local w = print
w(...)
-
io.write(...)
-
local w = io.write
w(...)
но все они работают одинаково.
Я также пытался запустить программу из команды Windows, которая примерно на 30% быстрее, чем консоль, захваченная в CLion.
Есть ли какие-нибудь хитрости, чтобы сделать это быстрее в Windows?Было бы замечательно, чтобы утилита ведения журналов была доступна в частях lua, но даже для отладки это слишком медленно для приложений реального времени.
Также: изменен заголовок