Вот функция на Си++ внутри 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.
Объясните пожалуйста.
