Медленный FFI.cast в Луаджите
Не могли бы вы объяснить низкую производительность FFI.cast в следующем фрагменте?
prof = требуется профиль местный ffi = требуется ("ffi") ffi.cdef [[ struct message { int field_a; }; ]] функция cast_test1() bytes = ffi.new("char[100000000]") сумма = 0 t1 = prof.rdtsc () для я = 11000000 до сумма = сумма + я конец t2 = prof.rdtsc () print ("test1", tonumber (t2-t1)) конец функция cast_test2() bytes = ffi.new("char[100000000]") сумма = 0 t1 = prof.rdtsc () для я = 11000000 до сумма = сумма + я msg = ffi.cast("struct message *", bytes+ i * 16) - msg.field_a = я конец t2 = prof.rdtsc () print ("test2", tonumber (t2-t1)) конец cast_test1() cast_test2()
Похоже, цикл с актерами бежит примерно в 30 раз медленнее. Есть идеи как это побороть?
% luajit -v cast_tests.lua LuaJIT 2.0.3 - Copyright (C) 2005-2014 Mike Pall. http://luajit.org/ test1 3227528 test2 94474000
1 ответ
Решение
Похоже, что глобальная переменная msg была основным виновником. Замена на локальную дает 20-кратное ускорение:)
Это актуально как для lualit-2.0.3, так и для lualit-2.1
функция cast_test3() local bytes = ffi.new ("char [100000000]") местная сумма = 0 локальный t1 = prof.rdtsc () для я = 11000000 до сумма = сумма + я local msg = ffi.cast("struct message *", bytes+ i * 4) msg.field_a = я конец локальный t2 = prof.rdtsc () локальная сумма2 = 0 для я = 11000000 до local msg = ffi.cast("struct message *", bytes+ i * 4) sum2 = sum2 + msg.field_a конец местный t3 = prof.rdtsc () печать (сумма, сумма2) печать ("test3", тонум (t2-t1), тонбер (t3-t2)) конец cast_test3()
Результаты:
% / usr / bin / luajit -v cast_tests.lua ~ / Проекты /lua_tests/lua_rdtsc LuaJIT 2.0.3 - Copyright (C) 2005-2014 Mike Pall. http://luajit.org/ 500000500000 500000500000 test3 4502508 4850884