ios - 如何在 Xcode 中使用 C 代码进行优化

标签 ios c xcode arm

这是一段这样的代码:

// example_3
int Add_8K_3(int* in, int* out, int b)
{
    int i;
    for(i=0;i<1024;i++)
    {
        int a0, a1;
        a0 = *in++;
        a1 = *in++;
        *out++ = a0 + b;
        *out++ = a1 + b;
    }
    return 0;
}

我通过 ARMCC 和 Xcode(通过 -O3)编译它。 但两种结果的表现却有很大不同。 Xcode中的循环次数大约是armcc结果的3倍。 ARM汇编代码

    {
                    Add_8K_3 PROC
    ADD      r0,r0,#4
    MOV      r3,#0x400
    PUSH     {r4}                  ;3264
|L1.12|
    SUBS     r3,r3,#1
    LDR      r4,[r0,#-4]           ;3271
    LDR      r12,[r0],#8           ;3271
    ADD      r4,r4,r2              ;3271
    STR      r4,[r1],#8
    ADD      r12,r12,r2
    STR      r12,[r1,#-4]
    BNE      |L1.12|
    POP      {r4}
    MOV      r0,#0
    BX       lr
                    ENDP
}

Xcode asm 代码

    {
_Add_8K_3:
    .cfi_startproc
Lfunc_begin3:
    .loc    1 77 0                  @ /Users/Emedia/Desktop/testperformance/testperformance/core.c:77:0
@ BB#0:
    .loc    1 76 19 prologue_end    @ /Users/Emedia/Desktop/testperformance/testperformance/core.c:76:19
    push    {r7, lr}
    mov.w   lr, #0
Ltmp15:
    @DEBUG_VALUE: i <- 0+0
    mov r7, sp
    @DEBUG_VALUE: Add_8K_3:in <- R0+0
    @DEBUG_VALUE: Add_8K_3:out <- R1+0
    @DEBUG_VALUE: Add_8K_3:b <- R2+0
LBB3_1:                                 @ =>This Inner Loop Header: Depth=1
Ltmp16:
    @DEBUG_VALUE: Add_8K_3:in <- R0+0
    @DEBUG_VALUE: Add_8K_3:out <- R1+0
    @DEBUG_VALUE: Add_8K_3:b <- R2+0
    @DEBUG_VALUE: i <- 0+0
    .loc    1 82 9                  @ /Users/Emedia/Desktop/testperformance/testperformance/core.c:82:9
    ldr.w   r12, [r0, lr, lsl #3]
    Ltmp17:
@DEBUG_VALUE: a0 <- R12+0
    add.w   r3, r0, lr, lsl #3
    .loc    1 83 9                  @ /Users/Emedia/Desktop/testperformance/testperformance/core.c:83:9
    ldr.w   r9, [r3, #4]
Ltmp18:
    @DEBUG_VALUE: a1 <- R9+0
    .loc    1 86 9                  @ /Users/Emedia/Desktop/testperformance/testperformance/core.c:86:9
    add.w   r3, r12, r2
    str.w   r3, [r1, lr, lsl #3]
    add.w   r12, r1, lr, lsl #3
    Ltmp19:
    .loc    1 79 20                 @ /Users/Emedia/Desktop/testperformance/testperformance/core.c:79:20
    add.w   lr, lr, #1
    Ltmp20:
@DEBUG_VALUE: i <- LR+0
    .loc    1 87 9                  @ /Users/Emedia/Desktop/testperformance/testperformance/core.c:87:9
    add.w   r3, r9, r2
    str.w   r3, [r12, #4]
Ltmp21:
    .loc    1 79 9                  @ /Users/Emedia/Desktop/testperformance/testperformance/core.c:79:9
    cmp.w   lr, #1024
    bne LBB3_1
Ltmp22:
    @ BB#2:
    movs    r0, #0
    .loc    1 93 5                  @ /Users/Emedia/Desktop/testperformance/testperformance/core.c:93:5
    pop {r7, pc}
Ltmp23:
Lfunc_end3:
}

我遇到的问题是 Xcode 无法通过合适的 asm 代码解析“in[X]”。 我的问题是: (1) 我如何编写C代码来生成Xcode可以将“in[X]”解析为合适的asm代码(如arm)的asm代码? (2) 有没有一些手册来描述clang和armcc的编译器差异,并告诉我如何高性能地为iOS编写C代码。

谢谢。

最佳答案

虽然 Apple 的 LLVM 生成了不错的代码(比 GCC 好得多),但它仍然无法与一流的 ARMCC 相比。

事实上,ARMCC 真的非常好。

但是,您的示例非常简单,即使是臭名昭著的 GCC 也不会失败。

您的代码有两件事搞砸了:

  1. ARMCC 在 ARM 模式下完成工作,LLVM 在 Thumb2 下完成
  2. XCode 二进制文件仍然包含调试/分析信息。您应该更改相应的选项。

NEON 可以更快地处理示例函数,但对于 iOS 部署,您需要 AARCH32 和 AARCH64 版本,并且两者在语法和寄存器分配方面有很大不同。

如果您尝试学习 ARM 汇编以进行优化,请不要这样做。 AARCH64 的 ISA 被完全重构和简化,这意味着即使是世界上最糟糕的编译器(例如 GCC)也能够生成还算不错的代码。

NEON 却是一个不同的故事。这可能是值得的。 (但是您必须编写 AARCH32 和 AARCH64 版本)

关于ios - 如何在 Xcode 中使用 C 代码进行优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19950052/

相关文章:

ios - 一个应用程序为不同的客户提供多种外观? (苹果规则)

ios - 使用动态约束对齐文本字段

ios - 以编程方式向 UIScrollView 添加按钮时如何禁用水平滚动?

ios - 当触摸 bg 时,如何淡入半透明 UIVIew 并关闭?

c - 如何将格式化数据存储到 C 中的数组?

c - 我的代码有什么问题(它没有调用该函数)?

ios - Xamarin Forms iOS 启动屏幕图像位置

iphone - (自定义)滚动后 UITableViewCell 混淆

ios - UIBarButtonItem 图像的颜色/不透明度

c++ - 在 64 位 x86 机器中读/写双值是原子的