运行循环29,000,000次迭代,在lua中更快

时间:2016-08-09 18:53:34

标签: loops lua

好吧所以我创建了一个处理数据的程序,但是我需要在字符串上运行这个函数,有时数据长度是29,000,000+个字符。如果我运行像

这样的循环
for x = 1, 29000000, 1 do
end
print("Done")

它立即完成,现在我并没有要求有人尝试立即完成此任务,但我怎样才能让它更快完成,因为它目前需要3个多小时才能完成10%,所以基本上是有一种方法可能允许lua使用更多的CPU或者可能使我的功能更有效

local function interpret(action, input, key)
    local byte, char, decrypt, encrypt, input, output, sub = string.byte, string.char, key.decrypt, key.encrypt, input, '', string.sub
    if (action == "decrypt") then
        for x = 1, (#input), 1 do
            output = (output .. (char(((byte(decrypt[sub(input, x, x)]) - (x + 2)) + 1) % 256)))
            if x % 10000 == 0 then print(x) end
        end
    else
        for x = 1, (#input), 1 do
            output = output .. (encrypt[char(((byte(sub(input, x, x)) + x) + 1) % 256)])
            if x % 10000 == 0 then print(x) end
        end
    end
    return (output);
end

1 个答案:

答案 0 :(得分:2)

当一个程序需要花费数小时和数小时才能运行(当它看起来不应该是这种情况时),可能你使用的算法具有糟糕的渐近时间复杂度。运行一些实验,看看运行算法所需的时间如何随输入字符串的长度而变化。

对于这个问题,我们理想地希望时间与输入的大小呈线性增长。将输入字符串的大小加倍应该会导致计算时间加倍。但是,在您的情况下(如评论所示)我怀疑您的算法是二次的。将输入大小加倍可能会导致计算时间翻两番。将输入增加10倍可能会使计算时间增加100倍。

如果你的算法是二次的,那么使它在一个合理的时间内长时间输入运行的唯一方法就是用另一个算法替换具有更好的渐近复杂度的算法。无论你对程序进行了多少调整,或者你使用的计算机硬件有多么强大,渐近的复杂性都会赶上你。例如,即使您对算法进行微调以使其运行速度快10000倍,它也只能处理100倍大小的输入。

在您的特定程序中,问题的根源是使用..运算符一次构建一个大字符串。在Lua中,这需要时间与传递给..的字符串的长度成正比,因为..的工作原理是将其输入复制到一个全新的字符串中。

最常见的解决方法是将字符串的各个部分存储在表中,然后使用table.concat将它们连接在一起。

local result = {}
for i = 1, (#input), 1 do
    result[i] = char(((byte(decrypt[sub(input, i, i)]) - (i + 2)) + 1) % 256)
end
return table.concat(result)