gpt4 book ai didi

performance - 如果 big.Int 为 0,还有另一种测试方法吗?

转载 作者:行者123 更新时间:2023-12-02 11:25:46 25 4
gpt4 key购买 nike

我正在与 big.Int 一起工作s 并且需要测试 0。现在,我正在使用 zero = big.NewInt(0)Cmp(zero)==0哪个工作正常,但我想知道是否有一种更快的方法专门用于 0(我需要这个程序非常快)?

最佳答案

big.Int 暴露 Int.Bits() 访问表示的原始字节,它是一个 slice ,它共享相同的底层数组:不复制返回的 slice 。所以它很快。它暴露于“支持实现缺少的低级 Int 功能”。
完美,正是我们想要的。
0. 测试 0big.Int 的文档还指出“Int 的零值表示值 0”。因此,在零值(表示 0 )中, slice 将为空( slice 的零值是 nil 并且 nil slice 的长度是 0 )。我们可以简单地检查一下:

if len(i1.Bits()) == 0 {
}
另请注意,还有一个 Int.BitLen() 返回 this 的函数,这也说明“0 的位长为 0”。所以我们也可以这样使用:
if i1.BitLen() == 0 {
}
让我们对这些解决方案进行基准测试:
func BenchmarkCompare(b *testing.B) {
zero := big.NewInt(0)
i1 := big.NewInt(1)
i2 := big.NewInt(0)
for i := 0; i < b.N; i++ {
if i1.Cmp(zero) == 0 {
}
if i2.Cmp(zero) == 0 {
}
}
}

func BenchmarkBits(b *testing.B) {
i1 := big.NewInt(1)
i2 := big.NewInt(0)
for i := 0; i < b.N; i++ {
if len(i1.Bits()) == 0 {
}
if len(i2.Bits()) == 0 {
}
}
}

func BenchmarkBitLen(b *testing.B) {
i1 := big.NewInt(1)
i2 := big.NewInt(0)
for i := 0; i < b.N; i++ {
if i1.BitLen() == 0 {
}
if i2.BitLen() == 0 {
}
}
}
基准测试结果:
BenchmarkCompare-8      76975251            13.3 ns/op
BenchmarkBits-8 1000000000 0.656 ns/op
BenchmarkBitLen-8 1000000000 1.11 ns/op
获取位并将 slice 长度与 0 进行比较是 快 20 倍 而不是将它与另一个 big.Int 进行比较代表 0 , 使用 Int.BitLen()也是 快 10 倍 .
1. 测试 1如果 big.Int 可以进行类似的测试值等于 1 ,但可能不如测试零快: 0是最特别的值(value)。它的内部表示是一个 nil slice ,任何其他值都需要非 nil片。另外: 0还有一个特殊的性质:它的绝对值是它自己。
这个绝对值属性很重要,因为 Int.Bits()返回绝对值。因此,在非零值检查的情况下,仅位片是不够的,因为它不携带符号信息。
所以测试 1可以通过检查位内容是否代表 1来实现,且符号为正:
func isOne(i *big.Int) bool {
bits := i.Bits()
return len(bits) == 1 && bits[0] == 1 && i.Sign() > 0
}
让我们对此进行基准测试,并将数字与 one := big.NewInt(1) 进行比较:
func BenchmarkCompareOne(b *testing.B) {
one := big.NewInt(1)
i1 := big.NewInt(0)
i2 := big.NewInt(1)
i3 := big.NewInt(2)
for i := 0; i < b.N; i++ {
if i1.Cmp(one) == 0 {
}
if i2.Cmp(one) == 0 {
}
if i3.Cmp(one) == 0 {
}
}
}

func BenchmarkBitsOne(b *testing.B) {
i1 := big.NewInt(0)
i2 := big.NewInt(1)
i3 := big.NewInt(2)
for i := 0; i < b.N; i++ {
if isOne(i1) {
}
if isOne(i2) {
}
if isOne(i3) {
}
}
}
以及基准测试结果:
BenchmarkCompareOne-8       58631458            18.9 ns/op
BenchmarkBitsOne-8 715606629 1.76 ns/op
不错!我们测试 1 的方式再次是 快 10 倍 .

关于performance - 如果 big.Int 为 0,还有另一种测试方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64257065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com