【记录一个问题】golang 中的 ecdsa(椭圆曲线加密) 算法很慢,因为用到了系统调用

发布时间 2023-11-06 16:03:32作者: ahfuzhang

代码中使用了椭圆曲线算法来签名,实际运行中发现不够快:

func BenchmarkECDSA(b *testing.B) {
	privateKeyInst, err := parseSignatureKey(privateKey)
	if err != nil {
		b.Error(err.Error())
		return
	}
	k := privateKeyInst.(*sysecdsa.PrivateKey)
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		_, _ = sysecdsa.SignASN1(rand.Reader, k, sha256Hash[:])
	}
}

在 macbook m2 下的 benchmark 为:

18044 ns/op	    2440 B/op	      33 allocs/op

profile 信息如下:

几乎全部消耗在 unix.getentropy 这个系统调用上。
本来还想优化以下,系统调用这个层面的优化比较耗时。先记下来,后面再想办法。

P.S 找到另一个库,号称 fast ,实际测试比系统库慢 100 倍:
https://github.com/starkbank/ecdsa-go