所以我想知道atmega2560以及一般情况下的分工成本: 我们说我有类似的东西
unsigned long long a=some-large-value;
unsigned long long b=some-other-large-value;
unsigned long result=(a-b)/A_CONSTANT
//A_CONSTANT i.e. 16
实际需要多长时间?我们是在谈论hundrets还是数千个周期?如果我将除法改为乘法,那么它是否会有所不同,即如此
unsigned long result=(a-b)*1/A_CONSTANT
我想在时间关键型应用程序中使用它来计算时间跨度,该时间跨度用于确定何时执行程序的另一部分。假设划分需要太多时间,我还有其他选择吗?
答案 0 :(得分:2)
这实际上取决于你的A_CONSTANT
以及IMO的编译器有多好。
我查了一下芯片,它显然是8位或16 MHz的8位处理器。
因此,如果你的分工是微不足道的话,我认为那些unsigned long long
整数是最大的障碍。
为此,它必须是2的幂(如2,4,8,16等)。那么会发生什么,将是一个优化,用一个简单的右移代替整个分区,这将在更少的周期内完成。
切换到乘法不会给你带来任何好处。您至少会遇到精度问题,而您当前的代码会始终产生结果0
,除非A_CONSTANT
是1
(因为您显然正在进行整数除法,其中结果向下舍入。)
那么做什么或是否考虑这个优化的东西在很大程度上取决于A_CONSTANT
的实际价值。
解决此问题(或比较解决方案)的最简单方法可能是比较生成的汇编代码,因为它将是实际处理的最终结果。纯粹基于理论对此进行优化是相当复杂的,甚至可能使您错误或误导结果。
答案 1 :(得分:0)