資源最佳化程式

lua-users home
wiki

Lua 資源最佳化程式是一個可以優化 Lua 原始碼的公用程式,主要是透過 [內聯函式] 來達成。

說明

內聯是一種局部評估的形式 [1]

程式

程式必須要使用 [Metalua 0.5](開發分支)。

程式包含下列檔案

快速入門

Download tar file from http://github.com/fab13n/metalua/tree/0.5-branch .

tar xzvf fab13n-metalua-28e8e1037ab33d96c123667f4c3fc94b5aca83bc.tar.gz
mv fab13n-metalua-28e8e1037ab33d96c123667f4c3fc94b5aca83bc metalua
cd metalua && make

Download sourceoptimizer.mlua and place in metalua/build/lib/dmlib .
Download sourceoptimize.lua and place in metalua/ .
Download fib.lua example and place in metalua/ .

./build/bin/metalua sourceoptimize.lua fib.lua
# or
./build/bin/metalua sourceoptimize.lua fib.lua  | lua -

範例

以下是基礎範例

-- input:
local y=-1
local function square(x) return x*x end
local function g(x) return x >= 0 and square(square(x))+1 or 1 end
while (function() y = g(y)^(1/4) return y < 2 end)() do
  print(y)
end

-- output:
local y = - 1
while 1 do
   local __v13x = y
   local __v10 = 0 <= __v13x
   if __v10 then
      local __v12x = __v13x
      local __v14x = __v12x * __v12x
      __v10 = __v14x * __v14x + 1
   end
   local __v11 = __v10
   if not __v11 then
      __v11 = 1
   end
   y = __v11 ^ (1 / 4)
   if not (y < 2) then
      break
   end
   print (y)
end

以下是內聯幾個 Lua 範例的狀況(函式名稱前需要加上「local」,這是內聯所需要的)

功能說明

程式可以內聯立即評估的匿名函式

x=(function(x) return x*x end)(y())
--> local __v1x=y() x=__v1x*__v1x

以及「常數」的局部函式(函式變數從未修改)

local function square(x) return x*x end; x=square(y())
--> local __v1x=y() x=__v1x*__v1x

程式可以刪除非必要函式,例如已完全內聯的函式(如上述範例)。程式可以正確地將表示式轉換為敘述

x = y or (function(x)z=1 return x*x end)(w)
--> local __v2=y if not __v2 then local __v1x=w z=1 __v2=__v1x*__v1x end x=__v2

if (function()x=x+1 return x end)() then f()
elseif (function()y=y+1 return y end)() then g()
else h() end
--> x=x+1 if x then f()else y=y+1 if y then g()else h()end end

使用 setfenv 和具有除錯函式庫的堆疊層級的函式可能無法正確地內聯。此問題可能會發生在存取任何全域變數時

local function f() local _ = x end
f()

理論上我們不應該內聯上述函式,因為存取全域變數 x「可能會」在全域環境中觸發元表,這可能會反過來變更 f 的環境,因此內聯 f 將會變更呼叫 f 的呼叫者環境。(LuaFiveTwo 中的環境將不再是個問題,但某些除錯函式仍會使用堆疊層級。)理想情況下,翻譯器應該擴充支援存在 Lua 註解中的指令,這些指令會定義我們想內聯的積極度

--!inline
local function f() local _ = x end
f()

它可以以每個函式為基礎,也可以在檔案中使用更全域的預設設定。(請參閱 LuaFish 中的 luaanalyze,以了解建議的語法設計。)

請參閱 sourceoptimizer.mlua 的原始碼以了解詳細資訊。

限制

警告:在特定情況下可能無法正常運作,例如內聯函式使用 setfenv 或使用堆疊層級的除錯函式(請見上述說明)。LuaFiveTwo 會提升 getfenv/setfenv 問題的影響。

可能的應用

可能的延伸

作者

DavidManura


RecentChanges · 偏好設定
編輯 · 歷程
最後編輯於 2010 年 9 月 18 日晚上 11:22(格林尼治標準時間)(diff)