Binary 朱莉娅:基函数10000x比相似函数快

Binary 朱莉娅:基函数10000x比相似函数快,binary,julia,Binary,Julia,我正在Julia中使用十进制到二进制转换器“bin()”,希望提高性能。我需要使用bigInt来解决这个问题,在我的文件中使用bigInt调用bin()将输出正确的二进制表示形式;但是,调用类似于bin()函数的函数需要一分钟的时间,而bin()大约需要.003秒。为什么会有如此巨大的差异 function binBase(x::Unsigned, pad::Int, neg::Bool) i = neg + max(pad,sizeof(x)<<3-leading_zero

我正在Julia中使用十进制到二进制转换器“bin()”,希望提高性能。我需要使用bigInt来解决这个问题,在我的文件中使用bigInt调用bin()将输出正确的二进制表示形式;但是,调用类似于bin()函数的函数需要一分钟的时间,而bin()大约需要.003秒。为什么会有如此巨大的差异

function binBase(x::Unsigned, pad::Int, neg::Bool)
    i = neg + max(pad,sizeof(x)<<3-leading_zeros(x))
    a = Array(Uint8,i)
    while i > neg
        a[i] = '0'+(x&0x1)
        x >>= 1
        i -= 1
    end
    if neg; a[1]='-'; end
    ASCIIString(a)
end



function bin1(x::BigInt, pad::Int)
    y = bin(x)
end



function bin2(x::BigInt, pad::Int,a::Array{Uint8,1}, neg::Bool)
    while pad > neg
        a[pad] = '0'+(x&0x1)
        x >>= 1
        pad -= 1
    end
    if neg; a[1]='-'; end
    ASCIIString(a)
end




function test()
    a = Array(Uint8,1000001)
    x::BigInt= 2
    x = (x^1000000)


    @time bin1(x,1000001)
    @time bin2(x,1000001,a,true)

end

test()
函数binBase(x::Unsigned,pad::Int,neg::Bool) i=负+最大(焊盘,尺寸f(x)>=1 i-=1 结束 如果负;a[1]='-';结束 ASCISTRING(a) 结束 函数bin1(x::BigInt,pad::Int) y=bin(x) 结束 函数bin2(x::BigInt,pad::Int,a::Array{Uint8,1},neg::Bool) 而pad>neg a[pad]=“0”+(x&0x1) x>>=1 pad-=1 结束 如果负;a[1]='-';结束 ASCISTRING(a) 结束 功能测试() a=阵列(UINT81000001) x::BigInt=2 x=(x^1000000) @时间bin1(x,1000001) @时间bin2(x,1000001,a,真) 结束 测试() 使用我可以看到Base.bin正在从调用一个C函数,该函数具有各种特定于机器的优化(在
mpn\u get\u str
中)


我还可以看到字节分配的巨大差异(bin1:1000106,bin2:62648125016)这需要更多的分析和调整,但我想上一段已经足够回答了。

正如Felipe Lema所指出的,Base将BigInt打印到GMP,它可以打印BigInt,而无需对它们进行任何中间计算——对BigInt进行大量计算以计算出它们的数字非常慢nd最终分配了大量内存。底线是:执行
x>=1
对于Int64值之类的操作非常有效,但对于BigInt之类的操作却没有那么有效。

Base.bin函数为什么会接受BigInt,因为该函数需要一个无符号的数字?我传递的BigInt是否在某个地方被分割成块?谢谢efan,我真的很感谢您对该语言所做的所有努力。
Base.bin
:有多种定义:通过所谓的“类型分派”选择合适的定义。在这种情况下,它调用
Base.Base
,这反过来调用GMP函数:
@profile bin1(x,1000001)
Profile.print()
Profile.clear()
@profile bin2(x,1000001,a,true)
Profile.print()
Profile.clear()