re: 一段代码优化的讨论 LouixG 2007-12-07 13:57
@cppexplore
每种优化可能只提高很小的性能,但为了达到极致把这些方法综合就能产生质的飞跃。优化也分算法优化和代码优化,我的想法就是在楼主算法确定的情况下最大可能的优化实现代码。
提到多线程主要是为了利用多核,但小数据量不推荐多线程,提到多核就多说点,在多核上跑得快的代码不一定在单核上跑的好,请看代码:
int * src1 = src;
int * src2 = src + 1;
int * dst1 = dst;
int * dst2 = dst + 1;
while ( ... )
{
*dst1 = *src1;
*dst2 = *src2;
dst1 += 2;
dst2 += 2;
src1 += 2;
src2 += 2;
};
这个代码可以肯定在单核上跑得很烂,但是在多核上dst1和dst2被流水线确定为无关变量,不相互影响就会被双核同时执行,这样就比单核上跑得快。
在指令层面上思考优化不一定带来移植性问题,例如这段代码:
double * src_opt = ( ( double * ) src ) - 1;
double * dst_opt = ( ( double * ) dst ) - 1;
int src_ind = 0;
int dst_ind = 0;
int loop_time = ( src_len >> 1 ) + 1;
while ( --loop_time )
{
dst_opt[ ++dst_ind ] = src_opt[ ++src_ind ];
}
Intel编译器产生的while循环的汇编:
$B68$3:
add edx, 1
fld QWORD PTR [edi+edx*8-8]
add eax, 1
fstp QWORD PTR [esi+eax*8-8]
add ecx, -1
jne $B68$3
这样的代码可以在兼容机上编译+运行无阻,且不说前两个add可被替换inc获得一定效率提升,我相信这段代码要比楼主的代码快。
只有有没有人做这样的工作就仁者见仁了,肯定有需要这种工作的时候。
re: 一段代码优化的讨论 LouixG 2007-12-07 09:17
你应该看看自己优化代码的汇编,你在文中说了一些读和写的计数,不知你是否是看了汇编后得出的结论。不同的编译器优化的结果也不一样,你用Intel的编译器试试,效果应该会更好。
我想到一些优化办法:
1,循环展开;
2,多线程;//这两个是高级语言代码优化,下面是面向特定机器的指令优化。
3,利用更强的单指令数据操纵能力:如果目标机器是32位,可以用浮点指令fld和fstp装载64位数据;如果目标机器是64位的那么可以直接使用64位寄存器;
4,利用SSE指令,SSE指令集对应的寄存器提供最多128位数据宽度;
5,如果你的目标机器不是兼容机而是PowerPC、SPARC或者嵌入式的架构,那推荐你查阅对应的CPU手册,在指令层次上寻找突破。