|
My suggestions, since it's easy for you to measure if there's any effect:
- local data_i= data[i]to cache the value, and avoid a number of table accesses (locals are fast)
- local data_i1= data[i][1] same thing- is 'data[i]' a table of two values that do not change? If so, just use it, not making a copy?
local data = dataGenerator() local subTable = {} local subTableBlock = {} local subTableType for i, element in ipairs(data) do
local data_i= data[i] local data_i1= data_i[1]
if data_i1 == "<type>" then subTableType = data_i[2] elseif data_i1 == "</type>" then elseif data_i1 == "<block>" then subTableBlock = {Number=data_i[2],Dup=data_i[3]} elseif data_i1 == "</block>" then subTable[#subTable+1] = subTableBlock else if trim(data_i[2]) ~= "" then subTableBlock[#subTableBlock+1] =
data_i -- in case it only has [1] and [2]
end end end return subTable, subTableType end
On 21.11.2006, at 17.40, Steve Heller wrote:
Unfortunately, my timing runs show that your suggestion makes no measurable difference. Any other suggestions would be welcomed. --- Romulo Bahiense <romulo@icontroller.com.br> wrote:I believe the problem is not table allocation, but index access and length calculation ('#' operator). Try this one: function createFieldDataEntriesForOneDataGenerator( dataGenerator ) local data = dataGenerator() local iSubTable = 0 local iSubTableBlock = 0 local subTable = {} local subTableBlock = {} local subTableType for i, element in ipairs(data) do local a, b, c = element[ 1 ], element[ 2 ], element[ 3 ] if a == "<type>" then subTableType = b elseif a == "</type>" then -- do nothing elseif a == "<block>" then subTableBlock = {Number=b,Dup=c} elseif a == "</block>" then iSubTable = iSubTable + 1 subTable[iSubTable] = subTableBlock else if trim(b) ~= "" then iSubTableBlock = iSubTableBlock + 1 subTableBlock[ iSubTableBlock ] = {a,b} end end end return subTable, subTableType end Note that, in this code, 'data[i]' is the same as 'element', because ipairs return key and value. --rb