我正在编写一个执行大量操作的应用程序,并且我正在尝试尽可能多地优化。
我正在尝试将除法(31 /总和)放在test2之外,因为这样一来,我可以在一个循环中仅执行1次该操作,否则将完成3次。
unsigned sum = 1234;
unsigned char test = 555;
unsigned char test2 = test * 31 / sum;
目标是
unsigned sum = 1234;
unsigned char test = 555;
unsigned division = 31 / sum;
unsigned char test2 = test * division;
C中的实例(简体)示例:
for (int i = 0; i < N; i++)
{
unsigned a=0,b=0,c=0,d=0;
int aux;
for (int j = 0; j < M; j++)
{
aux = arr[j];
if (conditions)
a += aux;
if (conditions)
b += aux;
if (conditions)
c += aux;
if (conditions)
d += aux;
}
unsigned char ua = a, ub = b, uc = c, ud = d;
unsigned sum = ua + ub + uc + ud + 1;
unsigned_char_array_a[i] = ua * 31 / sum;
unsigned_char_array_b[i] = ub * 31 / sum;
unsigned_char_array_c[i] = uc * 31 / sum;
unsigned_char_array_d[i] = ud * 31 / sum;
}
谢谢。
OP似乎想避免整数除法-一些(嵌入式)处理器的速度很慢-即使它们具有快速乘法。
// 4 divisions.
unsigned sum = ua + ub + uc + ud + 1;
unsigned_char_array_a[i] = ua * 31 / sum;
unsigned_char_array_b[i] = ub * 31 / sum;
...
给出sum
的值将在[1-1021]范围内,代码可以进行缩放乘法,然后除以恒定的2的幂。好的编译器将实现简单的快速转换。使用32位int/unsigned
:
缩放比例为65536
#define SCALE 65536u
unsigned factor = (31 * SCALE)/sum;
unsigned_char_array_a[i] = (ua * factor) / SCALE;
unsigned_char_array_b[i] = (ub * factor) / SCALE;
...
未经测试的断言:我并不期望每次商均与(ua * 31) / sum;
完全相同,但应在1以内。