Вот функция на Си++ внутри dll. Она принимает таблицу и выдаёт обратно в Луа сумму элементов этой таблицы.
Я ожидаю, что чем больше элементов будет в таблице, тем сильнее dll должна опережать аналогичные подсчёты в Луа.
Написал код для сравнения скорости.
Луа медленнее в 2,4 раза. Я мучаюсь с Си ради роста скорости в 100 раз, ну да ладно. В 2,5 раза тоже кое-что. Сказываются транспортные издержки при перекидывании данных между Си и Луа.
************************
А теперь удивительное для меня. Заполняю таблицу 40 элементами.
Значит внутри Си++ будет производиться в 2 раза больше операций и она сможет лучше проявить своё преимущество в скорости по сравнению с Луа.
Но нет: при 40 элементах в таблице преимущество Си в скорости такое же.
Почему?
Я думал, что чем больше таблица, тем быстрее будет работать вариант кода с dll.
Объясните пожалуйста.
Код |
---|
static int forLua_SumArray(lua_State* L) { // Get the length of the table (same as # operator in Lua) int n = lua_objlen(L, 1); double sum = 0.0; // For each index from 1 to n, get the table value as a number and add to sum for (int i = 1; i <= n; ++i) { lua_rawgeti(L, 1, i); sum += lua_tonumber(L, -1); lua_pop(L, 1); } lua_pushnumber(L, sum); return 1; } |
Написал код для сравнения скорости.
Код |
---|
iterations=1000000 function main () t={} for i=1,20 do--вставляем в таблицу 20 элементов table.insert(t,i) end --гоняем цикл миллион раз start=os.clock() for i=1,iterations do s=runfast.SumArray(t) end finish_dll=os.clock()-start mm("dll:"..finish_dll) --гоняем цикл миллион раз start=os.clock() for i=1,iterations do s=sum(t) end finish_lua=os.clock()-start mm("Lua:"..finish_lua) mm("Lua slower:"..math_round((finish_lua/finish_dll),1)) end |
Луа медленнее в 2,4 раза. Я мучаюсь с Си ради роста скорости в 100 раз, ну да ладно. В 2,5 раза тоже кое-что. Сказываются транспортные издержки при перекидывании данных между Си и Луа.
************************
А теперь удивительное для меня. Заполняю таблицу 40 элементами.
Код |
---|
t={} for i=1,40 do table.insert(t,i) end |
Но нет: при 40 элементах в таблице преимущество Си в скорости такое же.
Почему?
Я думал, что чем больше таблица, тем быстрее будет работать вариант кода с dll.
Объясните пожалуйста.