LUA:在嵌套表中添加值

我有一个性能问题,想收集一些关于如何改进它的想法。应用程序非常简单:我需要在嵌套表中添加值,以获得用户想支付的所有待定付款的总额。用户选择一定数量的付款,我计算他们要支付的金额。

这是我所拥有的:

jsonstr = "{    "name": "John",
    "surname": "Doe",
    "pending_payments": [
        {
            "month": "january",
            "amount": 50,
        },
        {
            "month": "february",
            "amount": 40,
        },
        {
            "month": "march",
            "amount": 45,
        },
    ]
}"

local lunajson = require 'lunajson'
local t = lunajson.decode(jsonstr)
local limit   -- 我从用户那里得到这个
local total = 0;

for i=1, limit, 1 do
    total = total + t.pending_payments[i].amount;
end;

它有效。最终我获得了我需要的东西。但是,我注意到它需要很长时间来进行计算。每个JSON只有十二个未决的付款(每月一个)。这需要两到三秒钟才能得出结果!我在不同的计算机和LUA 5.1、5.2、5.3上尝试过,结果是相同的。

请问有谁能提供更好的实施方法吗?

谢谢!

点赞
用户107090
用户107090

对于这个简单的字符串,请尝试下面的测试代码,它可以直接从字符串中提取金额,而不需要使用 json 解析器:

jsonstr = [[{    "name": "John",
    "surname": "Doe",
    "pending_payments": [
        {
            "month": "january",
            "amount": 50,
        },
        {
            "month": "february",
            "amount": 40,
        },
        {
            "month": "march",
            "amount": 45,
        },
    ]
}]]

for limit=0,4 do
    local total=0
    local n=0
    for a in jsonstr:gmatch('"amount":%s*(%d+),') do
        n=n+1
        if n>limit then break end
        total=total+tonumber(a)
    end
    print(limit,total)
end
2020-06-11 22:17:39
用户9582610
用户9582610

我发现延迟与 LUA 中的计算无关。这与获取 limit 变量的可配置延迟有关。

我没有与所提问的问题有关的内容可以分享,因为问题实际上是在一个外部元素中出现的。

感谢 @lfh 的回复。

2020-06-12 17:15:18