为何确认变量为2^N且常乘除尽量用移位?

1个回答

写回答

123321765哈

2026-01-01 21:35

+ 关注

linux
linux

没错,速度会快很多,实践中存在这样的实例,像linux的FAT驱动里记录super block信息的结构体便是。 其中:

和:

就是数值及其对应的位移。在文件系统里,计算偏移量时要清楚cluster大小和一块中的目录项数量,这些数值为2^N形式,所以该结构体专门设两个成员保存移位数量(此值因分区而异,需在运行时算出),在对这些值进行乘除运算时,直接采用移位运算。所以,若某变量确定为2^N形式,且常参与乘除(含求余)运算,就尽量采用移位运算。评论区有人不信,那我把指令手册的性能指标贴出来好了。

latency可被视作这条指令在CPU上所需的周期数。例如CPU主频为4G,若latency是4,那么CPU每秒能执行1G条指令。through put指的是指令并发的情形,即在流水线模式里,平均一个周期下单条指令的耗费。例如最上面的ADD,执行一个指令需1个周期,不过在1个周期内能够并发执行4个ADD。上图表格为IceLake指标,Intel近几代CPU大体没什么改变。乘法的开销是加法和移位的3 - 4倍,除法开销更甚,达十几倍。有人或许认为十几个周期的开销不算什么,可一般来说,一个函数调用(CALL指令)的开销都比这要小。手册的全部内容已在其他回答里,我就不再贴出了。

举报有用(0分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号