ステータス:これまでのところ、最良の回答のプログラムは元のプログラムの 33% の時間で実行されています! しかし、おそらくそれを最適化する他の方法がまだあるでしょう。
Lua は現在、最速のスクリプト言語ですが、C/C++ に対するいくつかのベンチマークでは、Lua のスコアが非常に低くなっています。
それらの 1 つは、マンデルブロ テスト (マンデルブロ セット ポータブル ビットマップ ファイル N=16,000 を生成) で、1:109 (マルチ コア) または 1:28 (シングル コア) という恐ろしいスコアを付けます。
速度のデルタが非常に大きいため、これは最適化の良い候補です。また、Mike Pall が誰であるかを知っている人は、これ以上最適化することはできないと考えるかもしれませんが、それは明らかに間違っています。最適化を行ったことがある人なら誰でも、常に改善できることを知っています。それに加えて、いくつかの微調整で追加のパフォーマンスを得ることができたので、それが可能であることを知っています:)
-- 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
では、これをどのように最適化できますか (もちろん、他の最適化と同様に、より高速であることを確認するために実装を測定する必要があります)。また、Lua の C コアを変更したり、LuaJit を使用したりすることは許可されていません。それは、Lua の弱点の 1 つを最適化する方法を見つけることです。
編集:チャレンジをより楽しくするために、これに賞金をかけます。