运行一个循环2900万次,在lua中更快地处理数据
2016-8-9 18:54:26
收藏:0
阅读:101
评论:1
好吧,我写了一个处理数据的程序,但我需要在字符串上运行此函数,有时数据长度超过2900万。如果我像这样运行一个循环:
for x = 1, 29000000, 1 do
end
print("完成")
它会立即完成,现在我并不是要求有人尝试使其立即完成,但是如何使其完成更快,因为它当前需要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 == "解密") 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
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

当一个程序运行了几个小时,而且看起来不应该是这样的时候,很可能你正在使用一个具有糟糕的演算法渐近时间复杂度算法。运行一些实验,看看运行算法所需的时间如何随着输入字符串长度的变化而变化。
对于这个问题,我们理想情况下希望随着输入规模的增加,时间呈线性增长。将输入字符串大小翻倍应该导致计算时间翻倍。但是,根据评论所示,在您的情况下,我怀疑您的算法是二次的。将输入大小翻倍可能会导致计算时间增加四倍。将输入增大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)