可能对于这种简单的 3x3 情况和编译器优化,最简单的O(N^2)
算法将足够快。如果有人想进行基准测试,我们非常欢迎您:
#include <stdio.h>
void lean_and_mean_mul(int a[3], int b[3], int out[3][3])
{
int i, j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
out[i][j] = a[i] * b[j];
}
}
}
int main(void)
{
int a[] = { 1, 2, 3 };
int b[] = { 4, 5, 6 };
int out[3][3];
lean_and_mean_mul(a, b, out);
int i, j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("%d ", out[i][j]);
}
printf("\n");
}
return 0;
}
让我们看看lean_and_mean_mul()
生成的程序集gcc -O2 -S
:
xorl %eax, %eax
.L2:
movl (%rsi), %ecx
imull (%rdi), %ecx
movl %ecx, (%rdx,%rax)
movl 4(%rsi), %ecx
imull (%rdi), %ecx
movl %ecx, 4(%rdx,%rax)
movl 8(%rsi), %ecx
imull (%rdi), %ecx
addq $4, %rdi
movl %ecx, 8(%rdx,%rax)
addq $12, %rax
cmpq $36, %rax
jne .L2
rep
ret
请注意,编译器决定展开一个循环。
随着gcc -O3
编译器展开两个循环。代码。它真的很快,因为它根本没有跳跃。