Медленный 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
Другие вопросы по тегам