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