Por que esse hack da otimização Lua melhoraria o desempenho?
Estou olhando por cima de umdocumento que descreve várias técnicas para melhorar o desempenho de Lua código de script e estou chocado que esses truques seriam necessários. (Embora eu esteja citando Lua, vi hacks semelhantes em Javascript).
Por que essa otimização seria necessária:
Por exemplo, o código
for i = 1, 1000000 do
local x = math.sin(i)
end
corre 30% mais lento que este:
local sin = math.sin
for i = 1, 1000000 do
local x = sin(i)
end
Eles estão re-declarandosin
função localmente.
Por que isso seria útil? É o trabalho do compilador fazer isso de qualquer maneira. Por que o programador precisa executar o trabalho do compilador?
Eu já vi coisas semelhantes em Javascript; e então, obviamente, deve haver umamuito boa razão pela qual o compilador de interpretação não está fazendo seu trabalho. O que é isso?
Eu o vejo repetidamente no ambiente de Lua em que estou brincando; pessoas que declaram variáveis como locais:
local strfind = strfind
local strlen = strlen
local gsub = gsub
local pairs = pairs
local ipairs = ipairs
local type = type
local tinsert = tinsert
local tremove = tremove
local unpack = unpack
local max = max
local min = min
local floor = floor
local ceil = ceil
local loadstring = loadstring
local tostring = tostring
local setmetatable = setmetatable
local getmetatable = getmetatable
local format = format
local sin = math.sin
O que está acontecendo aqui que as pessoas têm para fazer o trabalho do compilador? O compilador está confuso sobre como encontrarformat
? Por que esse é um problema que um programador precisa lidar? Por que isso não teria sido resolvido em 1993?
Também pareço ter atingido um paradoxo lógico:
A otimização não deve ser feita sem criação de perfilLua não tem capacidade de ser perfiladaLua não deve ser otimizada