跳至內容

TI-Lua/提高腳本運行速度

計算器百科,非營利的計算器專業知識百科。
此條目尚未完工。
此條目尚未完工。原作者將會繼續進行編寫,而您也可以對該條目進行編輯

本章講述一些腳本優化方法。

但是請注意到,腳本語言無論怎樣優化,都不會比優化過的本地碼程序快。但是如果希望自己的程序在運行時不至於卡到你想怒摔計算器,可以考慮在自己的程序中應用這些方法。

針對速度優化

此節會討論如何讓程序運行的更快。

合併邏輯

如果你的所有邏輯分支到最後都要做同一件事(比如刷新屏幕),那麼就把刷新屏幕放到邏輯之外。

舉個例子:

function on.charIn(c)
  if c == "a" then
      -- do something
      -- platform.window:invalidate()
      -- ^ don't refresh your screen here
      -- or else you have to do it everywhere
  elseif c == "b" then
      -- do something
  elseif c == "c" then
      -- did I just say do something?
  else
      -- you know it
  end
  platform.window:invalidate()
  -- ^ do it here, outside of the logic
end

展開函數

就像在 C/C++ 中那樣,對於小而零碎的函數或者經常調用的函數做內聯處理,有助於減少代碼中的跳轉次數,提高運行速度。

然而, Lua 沒有宏處理器,更沒有 inline 關鍵詞。所有的內聯展開都要手動完成。

展開內聯通常會導致代碼可讀性下降。因此應該在發布時做這些事情。

緩存變量

在函數中調用超過兩次的非直接變量應該使用一個局部變量緩存下來,避免多次查詢變量。

比如你要頻繁的使用一個表中的一些數據,在函數中將這個數據用局部變量複製下來是一個好主意。這也有助於讓你的代碼更整潔。

針對大小優化

此節會討論如何縮減程序大小。

合併重複的代碼段

platform.window:invalidate() 之類冗長的代碼,完全可以用一個名字簡單的函數代替。

同樣的,對於代碼中經常出現的無參數或定參數代碼段,可以將他們合併到一個獨立的函數裡。

使用混淆工具

儘管聽起來很扯,但是這的確是減小腳本文件的方法。將雖然有意義但是長的變量名轉化成一兩個無意義的字母能夠節省很多空間。但是請注意,混淆工具會使得你的代碼不再具有可維護性。你應該僅在發布時混淆代碼並轉換成 tns 文件。