Assembly ASM使用循环更快?

Assembly ASM使用循环更快?,assembly,Assembly,汇编程序中的代码循环是否比只写x次指令更快/相等/更慢,这是必需的?还是依赖于代码? 但是,机器什么时候执行二进制文件更快:如果16位cpu直接向前读取16位,还是向后读取32位 最后,;asm中的循环是什么意思?视情况而定。重复一些指令可能会更快。这种技术通常被称为。未展开的循环也会变得更有效,因为代码会更小,而且许多CPU都有能力识别循环模式并预测它。也可以有一个部分展开的循环。例如,与直接执行20条指令或执行20次循环迭代不同,可以执行5次循环迭代,每次执行4条指令 通常,如果不知道您的目

汇编程序中的代码循环是否比只写x次指令更快/相等/更慢,这是必需的?还是依赖于代码? 但是,机器什么时候执行二进制文件更快:如果16位cpu直接向前读取16位,还是向后读取32位


最后,;asm中的循环是什么意思?

视情况而定。重复一些指令可能会更快。这种技术通常被称为。未展开的循环也会变得更有效,因为代码会更小,而且许多CPU都有能力识别循环模式并预测它。也可以有一个部分展开的循环。例如,与直接执行20条指令或执行20次循环迭代不同,可以执行5次循环迭代,每次执行4条指令

通常,如果不知道您的目标体系结构(即CPU的品牌和型号),就很难判断什么是最好的。这就是为什么人们不经常编写汇编代码的原因——分析不同方法的优缺点、执行成本以及为不同的CPU品牌和型号生成不同的代码是编译器开发人员要做的事情。其他人则用自己选择的语言编写代码,编译器为目标平台生成可能的最佳程序集,这在99%的情况下都是可行的

要回答您的问题,您可能需要自己编写这两个版本,并对它们进行分析,以确定哪一个版本获胜。或者,您可以用C编写代码,并为您的平台启用优化(即使用
-O3
-march
开关),然后查看编译器生成的内容—它肯定做了正确的事情


希望能有帮助。祝你好运

asm中的循环通常表示分支(如果相等或类似)。如果您使用的是HLE,而不是在一条指令中执行比较和分支的平台上工作,那么它可能是一条伪指令,相当于x86
cmpl
,然后是
je

MIPS分支说明:

另外,请查看以下问题:


在汇编中,一切都取决于代码和机器。在现代处理器(如x86-64)中,最快的计算方式要求在所有时钟保持所有内核和所有CPU线程繁忙之间找到最佳折衷方案,通过最佳使用缓存避免CPU暂停(如果数据适合缓存,即),如果任务允许,使用矢量化指令等。对于486和更早的处理器来说,当只有CPU/FPU并行执行时,事情就简单了。现在,为了获得最快的代码,您需要注意每个时钟上所有的几个内核都会做一些有用的事情。因此,如果指令量大于循环指令所能处理的(跳回)数量,asm循环几乎不可能是进程-也就是说,如果我的文件不超过512字节,那么我就不能在最后一个字节进行循环调用。->或者,如果在16位cpu上添加32位和32位,cpu必须自动将此操作拆分为循环。然后,将1比特相加16倍的循环与将16比特加到零/空寄存器的速度一样快。还有一个问题是,在执行代码时,循环指令允许使用什么寄存器,哪些寄存器可以相交,哪些寄存器可以不相交。首先,这不是关于进程,而是关于处理器核心。其次,
loop
不一定是循环的最快指令。第三,你应该检查和神秘的优秀答案。同意,这在很大程度上取决于。展开循环只有在展开的代码不会影响CPU缓存的各级指令的大小时才是有益的。如果缓存未命中的惩罚高于分支/分支预测未命中的惩罚,则至少是这样。正如您所说,部分展开通常是有益的,例如,一次迭代处理至少一个缓存线的数据,或一个“整行”向量寄存器。部分展开的循环通常比紧密的循环提供更多的“延迟隐藏”(即加载/存储操作与ALU操作混合)机会。