【发布时间】:2012-12-21 20:20:07
【问题描述】:
我的应用程序中有循环执行数学乘法和加法计算。
我知道一些事实:
- android 设备支持 armv6 及更高版本的处理器
- armv6 不支持 NEON 命令
如果我将开始使用汇编程序数学命令而不是 c 数学命令,我是否会提高 armv6 上的应用程序性能?
更新
我需要用数学运算更快地执行循环,这是使用汇编程序而不是 c 的正确方法。
更新
我有这个计算:
Ry0 = (b0a0 * buffer[index] + b1a0 * Rx1 + b2a0 * Rx2 - a1a0 * Ry1
- a2a0 * Ry2);
它是双二阶传递函数。
我可以强制使用 asm 更快地执行这个计算吗?
更新
- 缓冲区大小为 192000
- 变量为浮点型
【问题讨论】:
-
其他人如何衡量您的应用程序的性能?尝试两种方法,然后比较结果。
-
不,编译器会很容易地解决这个问题。在 1980 年代,人类曾经胜过编译器,但那是很久以前的事了。
-
这是 21 世纪,编译器比黑暗时代要聪明得多,所以 pro-tip 不要试图智取编译器并认为你是比这些软件工具更聪明......只是说:)
-
@BoPersson:我完全不同意。我使用极其优化的代码并编写了大量的 ARM 程序集。在定期编写优化程序集方面,我击败了 GCC、LLVM 和 RVCT。这需要相当多的练习和大量的时间,但是说人类没有超越编译器是不正确的。
-
编译器永远无法以无限的运行时间超越人类。不幸的是,没有人有无限的运行时间。 C 标准狂热者喜欢指出许多细微差别。如果算法不需要它们,那么总是有可能胜过编译器。两全其美的是使用内联汇编器。 ARM 有各种 multiply-accumulate 指令。如果编译器不生成这些,inline assembler 可以轻松处理这种情况。