Статус: Пока программа с лучшим ответом выполняется в 33% времени от оригинальной программы! Но, возможно, есть и другие способы его оптимизации.
Lua в настоящее время является самым быстрым языком сценариев, однако Lua показывает очень плохие результаты в нескольких тестах по сравнению с C / C ++.
Одним из них является тест Мандельброта (переносимый файл растрового изображения с набором Мандельброта N = 16 000), где он оценивается как ужасный 1: 109 (многоядерный) или 1:28 (одноядерный)
Поскольку дельта по скорости довольно велика, это хороший кандидат на оптимизацию. Также я уверен, что те, кто знают, кто такой Майк Палл, могут поверить, что невозможно оптимизировать это дальше, но это явно неправильно. Любой, кто провел оптимизацию, знает, что всегда можно сделать лучше. Кроме того, мне удалось добиться некоторой дополнительной производительности с помощью нескольких настроек, поэтому я знаю, что это возможно:)
-- The Computer Language Shootout
-- http://shootout.alioth.debian.org/
-- contributed by Mike Pall
local width = tonumber(arg and arg[1]) or 100
local height, wscale = width, 2/width
local m, limit2 = 50, 4.0
local write, char = io.write, string.char
write("P4\n", width, " ", height, "\n")
for y=0,height-1 do
local Ci = 2*y / height - 1
for xb=0,width-1,8 do
local bits = 0
local xbb = xb+7
for x=xb,xbb < width and xbb or width-1 do
bits = bits + bits
local Zr, Zi, Zrq, Ziq = 0.0, 0.0, 0.0, 0.0
local Cr = x * wscale - 1.5
for i=1,m do
local Zri = Zr*Zi
Zr = Zrq - Ziq + Cr
Zi = Zri + Zri + Ci
Zrq = Zr*Zr
Ziq = Zi*Zi
if Zrq + Ziq > limit2 then
bits = bits + 1
break
end
end
end
if xbb >= width then
for x=width,xbb do bits = bits + bits + 1 end
end
write(char(255-bits))
end
end
Итак, как это можно оптимизировать (конечно, как и при любой оптимизации, вы должны измерить свою реализацию, чтобы быть уверенным, что она быстрее). И вам не разрешено изменять C-ядро Lua для этого или использовать LuaJit, чтобы найти способы оптимизации одного из слабых мест Lua.
Редактировать: Назначить награду за это, чтобы сделать вызов более увлекательным.