c - 什么在 ARM 上更快? MUL 或 (SHIFT + SUB)?

标签 c performance optimization assembly arm

哪个在 ARM 上更快?

*p++ = (*p >> 7) * 255;

or

*p++ = ((*p >> 7) << 8) - 1

基本上我在这里做的是获取一个 8 位字,如果 >= 128 则将其设置为 255,否则设置为 0。

最佳答案

如果pchar下面的语句只是对 255 的赋值.

*p++ = ((*p >> 7) << 8) - 1

如果pint ,那当然是另外一回事了。

您可以使用 GCC Explorer查看程序集输出的样子。以下是您从 Linaro's arm-linux-gnueabi-g++ 4.6.3 获得的内容与 -O2 -march=armv7-a旗帜;

void test(char *p) {
  *p++ = (*p >> 7) * 255;

}

void test2(char *p) {
  *p++ = ((*p >> 7) << 8) - 1 ;
}

void test2_i(int *p) {
  *p++ = ((*p >> 7) << 8) - 1 ;
}

void test3(char *p) {
  *p++ = *p >= 128 ? ~0 : 0;
}

void test4(char *p) {
  *p++ = *p & 0x80 ? ~0 : 0; 
}

创造

test(char*):
    ldrb    r3, [r0, #0]    @ zero_extendqisi2
    sbfx    r3, r3, #7, #1
    strb    r3, [r0, #0]
    bx  lr
test2(char*):
    movs    r3, #255
    strb    r3, [r0, #0]
    bx  lr
test2_i(int*):
    ldr r3, [r0, #0]
    asrs    r3, r3, #7
    lsls    r3, r3, #8
    subs    r3, r3, #1
    str r3, [r0, #0]
    bx  lr
test3(char*):
    ldrsb   r3, [r0, #0]
    cmp r3, #0
    ite lt
    movlt   r3, #255
    movge   r3, #0
    strb    r3, [r0, #0]
    bx  lr
test4(char*):
    ldrsb   r3, [r0, #0]
    cmp r3, #0
    ite lt
    movlt   r3, #255
    movge   r3, #0
    strb    r3, [r0, #0]
    bx  lr

如果您不吹毛求疵,最好始终检查生成代码的汇编,了解这些细节。人们倾向于overestimate compilers ,我同意大多数时候他们做得很好,但我想任何人都有权质疑生成的代码。

您还应该小心解释指令,因为由于核心的架构特征(例如具有乱序、超标量深度管道),它们并不总是匹配到周期精确列表。所以它可能并不总是最短的指令序列获胜。

关于c - 什么在 ARM 上更快? MUL 或 (SHIFT + SUB)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18388166/

相关文章:

c - 如何计算 bfOffBits

python - OpenCV Python : Reading and setting every pixel too slow

PHP - 全局变量的性能和内存问题

java - 现代 Java 如何优化自分配?

C++ 缓存感知编程

c - 重新分配二维字符数组

mysql - C 中的函数返回 MYSQL_RES

c - 动态内存分配器(堆)

PHP 设置 [pm.max_children、pm.start_servers、pm.min_spare_servers 和 pm.max_spare_servers]

python - 使用 Python 优化数组之间的 bool 比较