2017-07-18 86 views
3

在我的代碼中,我需要跟蹤某個值(字符串,總是......)在本地。我想知道是否運行時將重新創建將該字符串放入本地之後,在官方Lua 5.3實現中進行檢查。有任何想法嗎?在這個lua.org document我至少聽說過Lua實現沒有字符串內部化(保留任何字符串的單個副本)。字符串引用

我正在重新啓動我的代碼,所以迄今爲止我做了微不足道的事情。的我可能每功能做一個例子是:

local src = l[1] 

-- `src` would hold a string 
+1

AFAIR PUC-Rio lua-5.3不再實習短串。此外,Lua 5.3和LuaJIT是兩個完全不同的東西。 – iehrlich

+5

此外,你試圖達到什麼目前還不清楚。說真的,你可能會更清楚一點,也許有一些額外的代碼,以及你期望它做什麼? – iehrlich

+0

@iehrlich對不起,我希望這段代碼在運行時不會很貴,但是我的問題是它是否會將字符串複製到我的本地值中。我希望它會直接指向字符串。我還想過(通過電子郵件)向Lua團隊問這個問題,但我懷疑我會得到快速答案。 – Hydro

回答

3

如果字符串拘禁或實際上不是不是問題 - 字符串實習只是爲了加快字符串比較的機制和(可能)騰出一些記憶需要創建一個字符串的CPU的開銷。

重要的是,lua中的字符串通常被稱爲reference types。這就是說,運行時值只保存並共享對字符串的引用,並將字符串賦值給運行時值僅僅是複製一個指針併爲此值設置適當的標記。

你的代碼的另一件事是它允許你在執行你的函數時避免多次哈希查找。例如,

local a  = tbl['mykey'] 
-- ... 
local other_a = tbl['mykey'] 

將導致兩個哈希查找,而

local cached_a = tbl['mykey'] 
-- ... 
local a = cached_a 
-- ... 
local other_a = cached_a 

將其降低到一個查找。但是,對於整數鍵通常這不是什麼大問題。但有時甚至整數鍵都會觸發哈希查找,即使它們很小。另外,它依賴於實現。 Lua很簡單。

+0

謝謝xd我也讀過Lua使用序列字段(1,2,3等)的數組,另外,爲了避免'nil'問題,我預先定義了一些類似於'local NULL = {},NULLF = false' 。 LuaJ(在TFM中使用的另一個Java實現)也使用數組來避免散列。儘管在LuaJIT中使用了優化內聯緩存(另一種實現) – Hydro

+1

@Matheus根據標準,表格的哈希表實現是唯一可行的選項。唯一可能不同的是平衡規則(決定數組部分的結束位置)。另外,LuaJIT有可能通過相同的密鑰消除一些隨後的哈希查找到同一個表,但那是另一回事。 – iehrlich