背景
基于前次的文章,继续对这个库进行力所能及的优化。
现在,我们对于golang优化的基础有了一些基础的理解。
比如:
- 结合benchmark与pprof
- 清理了代码中出现的重复逻辑
- 初步探索了栈与指针对于内存和性能的影响
我们继续来对代码进行优化,具体方法如下:
Benchmark
首先,为了更好的理解我们之前的结果,很体力活的为每个函数都加了Benchmark测试。
指针转化
BenchmarkSm2P256FromBig-16 3303530 361 ns/op 128 B/op 2 allocs/op
BenchmarkSm2P256ToBig-16 6051643 199 ns/op 32 B/op 1 allocs/op
这里我们发现反复的指针和类型转化会在代码中消耗很多内存,cpu操作,时间。因此第一步我们把非必要的类型转化都避免了。
before
func somefunc(a type a) type b{
Ia = convert(a)
Ia.add
....
return convert'(Ia)
}
after
func somefunc(a type a) type b{
...
return a.add
}
另外一种是通过特殊值做等效处理。 比如代码中有指针转换后,转化后的对象调用equals
的函数。
我们可以进行逻辑等效转化
before
return covert(A).Equals(covert(B))
after
return A - B == 0