• Subject: Re: How to clone a table in LJ2-friendly way?
• From: "Dimiter \"malkia\" Stanev" <malkia@...>
• Date: Sat, 27 Aug 2011 02:56:09 -0700

Here is one more version, still not lj2 friendly, but for some reason very much lua friendly (no closure, using directly next iterator):
```
malkia ~/p/luamarca \$ ./run_benchmark.sh bench/tclone.lua 100000
Results:
lua
-------------------------------------------------------------------
name |     rel | abs s / iter = us (1e-6 s) / iter
-------------------------------------------------------------------
tclone6 |  1.0000 |   2.94 /     100000 = 29.400000 us
tclone5 |  4.9592 |  14.58 /     100000 = 145.800000 us
tclone2 |  5.6190 |  16.52 /     100000 = 165.200000 us
lua_nucleo |  5.8401 |  17.17 /     100000 = 171.700000 us
luajit -O
-------------------------------------------------------------------
name |     rel | abs s / iter = us (1e-6 s) / iter
-------------------------------------------------------------------
tclone6 |  1.0000 |   1.45 /     100000 = 14.500000 us
tclone5 |  1.1103 |   1.61 /     100000 = 16.100000 us
tclone2 |  1.3034 |   1.89 /     100000 = 18.900000 us
lua_nucleo |  1.5241 |   2.21 /     100000 = 22.100000 us

local tclone6
do
local function impl(t, visited, rtimes)
if visited[t] then
error("recursion detected")
end

if rtimes == 128 then
rtimes = 1
visited[t] = true
end

local r = {}
local k, v = next(t)
while k do
if type(k) == "table"  then
if type(v) == "table" then
r[impl(k, visited, rtimes + 1)] = impl(v, visited, rtimes + 1)
else
r[impl(k, visited, rtimes + 1)] = v
end
elseif type(v) == "table" then
r[k] = impl(v, visited, rtimes + 1)
else
r[k] = v
end
k, v = next(t, k)
end

if rtimes == 1 then
visited[t] = nil
end

return r
end

tclone6 = function(t)
if type(t) == "table" then
return impl(t, { }, 1)
end

return t
end
end

On 8/22/11 9:37 AM, Dimiter "malkia" Stanev wrote:
```
```On 8/22/11 3:29 AM, Alexander Gladysh wrote:
```
```On Sun, Aug 21, 2011 at 05:03, Dimiter "malkia"
Stanev<malkia@gmail.com> wrote:
```
```Here is a little bit more optimized version.
```
```
<...>

Thank you, very interesting!

Can I reuse it in lua-nucleo (under MIT license)?

Alexander.

```
```
Yes, no problem, and license of your choosing (I usually go with MIT
too, as lua and luajit are there, no need to make it more complex).

Cheers!

```
```

```