[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: stackoverflow with LuaJIT 2.0.0-beta6 (but not with lua 5.1.4)
- From: Valerio Schiavoni <valerio.schiavoni@...>
- Date: Thu, 21 Apr 2011 01:36:37 +0200
hi,
On Thu, Apr 21, 2011 at 12:56 AM, Geoff Leyland
<geoff_leyland@fastmail.fm> wrote:
> How about having encode do this:
> function encode(data)
> local out = { n=1}
> encode_table(data, out)
> return table.concat(out)
> end
> and encode_data contains lines like:
> encode_table(v, out)
yes, this helped a bit but still not enough :
function encode(data)
local t = type(data)
if t == 'table' then -- list(array) or hash
local i = 1
local list = true
for k, v in pairs(data) do
if k ~= i then
list = false
break
end
i = i + 1
end
local out = {}
if list then
out[1] = 'l'
for k, v in pairs(data) do
table.insert(out,encode(v))
end
else -- hash
out[1] = 'd'
for k, v in pairs(data) do
table.insert(out,encode(k))
table.insert(out,encode(v))
end
end
table.insert(out,'e')
return table.concat(out,'')
elseif t == 'string' then
return table.concat({#data,data},':')
elseif t == 'number' then
-- we need to convert scientific notation to decimal
return table.concat({'i',misc.to_dec_string(data),'e'},'')
elseif t == 'nil' then -- extension of benc
return 'n'
elseif t == 'boolean' then -- extension of benc
if data then
return 't'
else
return 'f'
end
end
end
If compared with the previous version that was using the ... operator,
I got the following results for varying input sizes (times given in
seconds):
base:
#data #time(s)
1K 0.00011491775512695
10K 0.012901067733765
100K 0.23692297935486
1M 92.385051012039
tuned:
#data #time(s)
1K 0.00011587142944336
10K 0.0037820339202881
100K 0.12719702720642
1M 51.690559864044
This is still too slow for input sizes >=1M. The ideal would be to go
under 1 second.
The benchmark code is as simple as :
data_sizes={1000,10000,100000,1000000}
for k,v in pairs(data_sizes) do
local gen= misc.gen_string(v)
for i=1,(v/100) do
gen={gen} --deep nesting
end
start=os.clock()
enc_data=test_encode(gen)
print((v/1000).."K", os.clock()-start)
end
misc.gen_string(v) simply generates a string made by the character 'a'
repeated v times.