APP下载

Golang 效能优化技巧—低阶优化

消息来源:baojiabao.com 作者: 发布时间:2024-05-13

报价宝综合消息Golang 效能优化技巧—低阶优化

Go语言中文网,致力于每日分享编码知识,欢迎关注我,会有意想不到的收获!

前言

自上篇文章写了 Golang 效能优化技巧—基础编码原则,已经过了一段时间了,此处是对上篇文章中提到的“低阶优化”做个说明。

“低阶优化”这个名词的含义是针对现代处理器的结构体系来设计程式码,使自己执行的程式更充分发挥出处理器应该有的效能。

了解现代处理器

要明白如何进行“低阶优化”,首先要知道现代处理器是如何执行一条指令,又在执行指令中会遇到什么情况会导致效能下降?

在单个处理器的设计中,cpu架构师为了提升指令的吞吐量,在处理器中实现了流水线系统。即原本一条指令的执行,需要经过取指(IF)、译码(ID)、执行(EX)、访存(MEM)、写回(WB)等一系列阶段。如执行一条指令需要等待上一条指令执行,那这个等待是对处理器来讲是一种浪费的行为。于是将一条执令的执行过程划分为许多的周期,在同一个周期内,多条指令能处于不同阶段执行,达到“指令级并行”现象,比如下图:指令i做完了取指阶段,到周期2时,则会进入到了译码阶段,同时会立即让下一条指令i+1进入取指阶段,这样指令i和i+1在周期2并行执行。

本图来源:https://www.cnblogs.com/CorePower/p/CorePower

在现代处理器为了使每个周期延迟尽可能小,会一将指令的执行划分成非常简单的步骤,一般采用了很深的流水线 (15或更多的阶段)。虽然采用了流水线的执行,但在实际程式执行中,基本不太可能达到处理流水线百分之百饱合。

例如:指令B需要等待指令A在将计算结果写入寄存a1中,指令B才能获取暂存器a1中的资料做执行计算,在指令B等待的过程是会有几个周期的延迟。又或者遇到条件语句(if),如果处理器预测进入流水线执行的指令不对,则需要取消后面载入的指令,重新载入新的指令,这样也会白白流费十几个周期。

正常编写出的程式很难让流水线达到饱和,但我们可以想办法使流水线尽量饱和。以下是通过举一个例子来说明程式如何通过此方式来提高效能,希望能帮助大家理解。

演示程式码

此段程式码是上篇文章中已经是经过指令级优过后的程式码,现在我们再对它进行"低阶优化"

测试资料

此次的测试程式码同上次的程式码是一样的,由于上次写的文章同此次的测试环境也有所差异,因此对上次的程式码还得重新测试

toSum4()新的测试结果如下:

循环展开

循环展开是通过程式的变换,通过增加每次迭代计算的元素,减少循环的迭代次数。对原有tosum4程式码做以下的变换

将 k += data[i] 变成 k += data[i] + data[i-1],这样做会带来怎么样的好处呢?

for语句中,每次迭代中都需要进行条件判断(i

提高并行性

虽然我们在上面进行展开了程式码,但是还是不能让流水线达到饱合,考虑到 k += data[i] + data[i - 1],此处实际执行中可能是先执行k+=data[i],等计算结果写入到暂存器中才能执行 k+=data[i-1]。对于加法指令可能并不会有太多的周期延迟,但是如果是针对乘除指令就会比较明显。因此,我们可以用多个累积变数来打破顺序等待的过程,让著两步操作'并行'执行

对 toSume5()函式改动后变成如下:

此处改动将原有一个累积变数 k 变成 两个,分别是k1和k2,两个累积量将 k1 += data[i] 和 k2 = data[i-1]之间的指令变成不会相互依赖,指令k2 = data[i-1]不需要等待上条指令的结果才能往下执行。

测试结果

我们对toSum6()进行效能测试,得到以下资料

对比toSum4() 和 toSum6()的效能对比又有了明显10s的提升。在这里只是对程式进行2次展开2次并行的处理,如果想让流水线更多饱合,那还可以进行更多的展开和并行处理,当然不是越多越好,考虑到暂存器的有限,如果累加值超过剩余暂存器的数量,增加多余的内存读写操作反而得不偿失,具体展开和并行次数还得根据程式所在的机器执行的情况决定。

总结

本文参考自《深入理解计算机系统》,在此只是举了一个例子,通过展开和并行的优化来加强对流水线的利用,表现出"低阶优化"带来的效果。虽然正常的开发中我们很少会这样处理,同时对程式码这样改动可能会变得更难理解。但是如果针对频繁执行的核心程式码来优化,那这样的优化是非常有必要的。某些大神的开源代码,他们在编码的考虑非常多,希望下次看到类似这种展开和多累积量的程式码,能帮助大家更明白其用意。

程式码

https://github.com/wpnine/PerformanceExample

作者:wp_nine

连结:https://www.jianshu.com/p/24abe4db740e

来源:简书

简书著作权归作者所有,任何形式的转载都请注明出处。

2019-09-22 23:53:00

相关文章