您的代码是 CPU 的 Rambo - 这是最糟糕的噩梦:
- 字节访问。就像提到的aroth一样,ARM从内存中读取字节非常慢
- 随机访问。除了本质上已经很严重的性能损失之外,还有两个绝对不必要的乘法/加法操作。
简而言之,一切都是错误的,可能是错误的。
不要说我粗鲁。让我做你的天使吧。
首先,我将为您提供一个有效的 NEON 版本。然后是一个优化的 C 版本,可以准确地向您展示您做错了什么。
给我一点时间。我现在要睡觉了,明天我有一个重要的会议。
你为什么不学习ARM汇编?它比 x86 汇编更容易和有用。它还将大大提高您的 C 编程能力。强力推荐
青色
==================================================== ==============================
好的,这是一个用 C 语言编写的优化版本,并考虑了 ARM 汇编。
请注意,pitch 和 a_lenx 都必须是 4 的倍数。否则,它将无法正常工作。
在此版本上使用 ARM 程序集进行优化的余地不多。(NEON 是一个不同的故事 - 即将推出)
仔细看看如何处理变量声明、循环、内存访问和 AND 操作。
并确保此功能在 ARM 模式下运行,而不是在 Thumb 模式下运行以获得最佳效果。
unsigned int compare(unsigned int *a, unsigned int a_pitch,
unsigned int *b, unsigned int b_pitch, unsigned int a_lenx, unsigned int a_leny)
{
unsigned int overlap =0;
unsigned int a_gap = (a_pitch - a_lenx)>>2;
unsigned int b_gap = (b_pitch - a_lenx)>>2;
unsigned int aval, bval, xcount;
do
{
xcount = (a_lenx>>2);
do
{
aval = *a++;
// ldr aval, [a], #4
bval = *b++;
// ldr bavl, [b], #4
aval &= bval;
// and aval, aval, bval
if (aval & 0x000000ff) overlap += 1;
// tst aval, #0x000000ff
// addne overlap, overlap, #1
if (aval & 0x0000ff00) overlap += 1;
// tst aval, #0x0000ff00
// addne overlap, overlap, #1
if (aval & 0x00ff0000) overlap += 1;
// tst aval, #0x00ff0000
// addne overlap, overlap, #1
if (aval & 0xff000000) overlap += 1;
// tst aval, #0xff000000
// addne overlap, overlap, #1
} while (--xcount);
a += a_gap;
b += b_gap;
} while (--a_leny);
return overlap;
}