如果我只需要整数除法的商,则可以使用__aeabi_uidiv。但是ARMCC编译器将__aeabi_uidivmod用于以下代码:

unsigned int a, b, c;
//...
//...
c = a/b;
/* use c for some operations */


在这种情况下,我不需要其余的,所以如果我直接调用__aeabi_uidiv,它将提高速度吗?像这样:

c = _aeabi_uidiv(a,b);


我正在考虑一个函数,其中的代码被称为数百万次。

最佳答案

除法算法自然需要商和余数。该过程类似于long division。通过不返回余数而节省的成本很小,仅涉及寄存器mov操作。另外,具有division的多个变体会破坏缓存效果,实际上您可能会使整个系统变慢。

这是一些libgcc来源。


bpapi.c
bpapi.S
bpapi-6m.S
divmod.c
udivmod.c
udivmodsi4.c
libgcc2.c,包含主除法算法。


如果您已确定并确定您的大部分时间都花在了除法程序中,则可以将剩余的时间从返回中删除,但这仍然需要计算。检查您的需求可能更好。

如果确实需要加快划分速度,则可以基于数据概要分析进行特殊处理。牺牲精度,不严格符合“ C”规则,并使用逆和平移表。与不返回其余部分相比,这些将提供更好的结果。

关于optimization - 比较__aeabi_uidiv和__aeabi_uidivmod,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16421071/

10-13 05:03