当前位置 : 主页 > 网络编程 > lua >

Lua整数类型

来源:互联网 收集:自由互联 发布时间:2021-06-23
我真的需要一个整数类型在Lua. 我的意思是整数类型是定义常规运算符(/ *等)的类型,并且表现得像一个整数,内部表示并不重要. 用桌子做这样的事情很简单,问题是,我试过了,而且表现非
我真的需要一个整数类型在Lua.

我的意思是整数类型是定义常规运算符(/ *等)的类型,并且表现得像一个整数,内部表示并不重要.

用桌子做这样的事情很简单,问题是,我试过了,而且表现非常差(当然).这是我的部分实现:

function num_op(a, b, calc_func)
    local atype = pytype(a)
    local btype = pytype(b)
    local a_val, b_val

    a_val = (atype == "Integer" or atype == "Double") and a[1] or a
    b_val = (btype == "Integer" or btype == "Double") and b[1] or b
    val = calc_func(a_val, b_val)

    if atype == "Integer" and btype == "Integer" then
        return Integer:create(val)
    else
        return Double:create(val)
    end
end

numeric_mt = { 
    __add = function(a, b)
        return num_op(a, b, function(a,b) return a + b end)
    end,

    __sub = function(a, b)
        return num_op(a, b, function(a,b) return a - b end)
    end,

    __div = function(a, b)
        return num_op(a, b, function(a,b) return a / b end)
    end,

    __mul = function(a, b)
        return num_op(a, b, function(a,b) return a * b end)
    end,

    __tostring = function(a)
        return tostring(a[1])
    end
}

-----------------------------
-- Integer type definition --
-----------------------------

Integer = {}
Integer_mt = table.copy(numeric_mt)
Integer_mt["__index"] = Integer

function Integer:create(value)
    local new_inst = {math.floor(value)}
    setmetatable(new_inst, Integer_mt)
    return new_inst
end

function Integer:className()
    return "Integer"
end

从我收集的主要性能损失(当然)非常多的分配. LuaJit能够很好的优化运算符的功能,而不是元化分配.

有人认为用custom c实现和userdata可以做得更好吗?还是我追求的是不可能实现的?

注意:我知道lua没有整数.我也知道我可以使用数学库获得相同的结果.我想要的是使用整数时的完整透明度,除了创建阶段.

编辑:我会在这里添加附加信息,以便所有内容仍然集中

@Mud:我需要在一定程度上以与python / ruby​​ / etc相同的方式具有透明的混合算术,但具有最佳性能.我使用luaJIT作为编译器的目标,常规Lua作为不支持luaJIT的平台的后备.这对于性能特征非常重要.

这意味着我想能够做到这一点:

a = int(5) -- Integer value
b = int(2) -- Another Integer
c = 2      -- Double
d = a / b  -- == 2 , integer arithmetics
e = a / c  -- == 2.5, floating point arithmetics

我可以达到这一点,上面的实现.问题是,我正在减慢每个数字的操作,因为常规数字也是盒装的.我可以使用调试库来重载数字的metatable,但是

>我不知道这个功能用于生产质量软件的可靠性
>数字性能仍然会降低,因为能够统一接口数字,所以我必须使用(number):get(),这样在任何情况下都会减慢运算速度.

我昨晚在C中滚动了自己的Integer实现.事实是,虽然这是对我在常规lua中的天真实现的改进,以及改进了对math.floor的内联调用,但是在使用LuaJIT时,使用LuaJIT并不清楚,其中内联调用仍然比C实现快得多.

另一种解决方案是始终使用未装箱的数字,并在我的编译器中使用某种类型的传播来跟踪整数,并在需要时对它们使用适当的内联操作,但是这种解决方案的复杂性要大得多,而且整体的失败使用Lua / LuaJIT作为后端的目的.

我会尝试你的实现,但我怀疑它会比在LuaJIT中的内联电话更好.这可能是我正在拍摄的(具有双重和整数的透明操作,以及接近luaJIT的内联呼叫的性能)是不可能的.非常感谢您的帮助.

@miky:谢谢,这看起来不错,但我怀疑我可以补丁luaJIT,如果我不能,它会失去所有的interrest为我的目标.

整数(默认为64位)刚添加到Lua 5.3!

http://www.lua.org/versions.html#5.3

网友评论