Optimization 搞笑的[或不是那么搞笑的]代码优化

Optimization 搞笑的[或不是那么搞笑的]代码优化,optimization,Optimization,Raymond Chen在最近关于代码优化的文章中有这样一句话。。。如果你考虑所有需要考虑的问题,那么明显的优化——一个需要优化的优化往往是“去优化”…p> 我敢肯定,你一定遇到过/甚至在了解更多信息后感到尴尬的编码优化 想分享吗?我最喜欢的例子是: 是的,它不使用临时变量,通常可以在三个处理器周期内完成,但它的作用并不明显 ,这是如此扭曲以至于它看起来甚至不应该在ISO C中编译: int n = (count + 7) / 8; switch (count % 8) { case 0: do

Raymond Chen在最近关于代码优化的文章中有这样一句话。。。如果你考虑所有需要考虑的问题,那么明显的优化——一个需要优化的优化往往是“去优化”…p> 我敢肯定,你一定遇到过/甚至在了解更多信息后感到尴尬的编码优化


想分享吗?

我最喜欢的例子是:

是的,它不使用临时变量,通常可以在三个处理器周期内完成,但它的作用并不明显

,这是如此扭曲以至于它看起来甚至不应该在ISO C中编译:

int n = (count + 7) / 8;
switch (count % 8) {
case 0: do { *to = *from++;
case 7:      *to = *from++;
case 6:      *to = *from++;
case 5:      *to = *from++;
case 4:      *to = *from++;
case 3:      *to = *from++;
case 2:      *to = *from++;
case 1:      *to = *from++;
           } while (--n > 0);
}
我最喜欢的是

// original code
int a[10];
a[5] = 3;

// optimized code
int a[10];
*(a + 5) = 3;

是的,突然之间,这是神奇的速度<代码>

这对我来说是一个特别的烦恼-人们让他们的代码不那么可读,因为,天哪,他们不想在堆栈中添加额外的4个字节。什么,这些人是在英特尔4004或RCA 1802 CPU上运行的?我认为现在的一些编译器可以检测并优化第一种情况。这种“优化”增加了数据依赖性,原始数据可以通过寄存器重命名由硬件处理。事实上,原始值很可能需要零个周期。@Luke:它适用于任何值。当然,XOR必须将值视为整数,因为第2行在第1行完成之前无法执行,第3行在第2行完成之前无法执行。所以CPU会爆炸很长时间,然后停止运行“1,2,3”,然后继续运行。相反,
x=y
y=temp
可以同时执行。啊,半展开循环的乐趣。=]这种设备令人憎恶,在当今高速大地址空间计算机的世界中没有一席之地。当然,这很酷,有点书呆子的味道,但是难以置信的没有必要。。。。因此,它被列入了一系列糟糕的代码优化中。我并不是通过在这个帖子中发布它来提倡它的使用+1,并在我的“意大利面代码”问题中添加了一个指针。我以前从未见过这颗珍珠实际上,它应该是“inta[10];a+=5;*(a+N)=3”;因为平均而言,CPU从数组中间到达给定元素的速度更快。如果您想要一个[9],它必须从原始解决方案的0开始一直计算。在我的优化中,它最多只能数5:-)哦,是的,指针数学。另一个我很高兴切换到托管语言的原因。@pax,
a+=5
无法工作,因为指向数组的指针无法更改。
// optimized version:
x ^= y;
y ^= x;
x ^= y;
int n = (count + 7) / 8;
switch (count % 8) {
case 0: do { *to = *from++;
case 7:      *to = *from++;
case 6:      *to = *from++;
case 5:      *to = *from++;
case 4:      *to = *from++;
case 3:      *to = *from++;
case 2:      *to = *from++;
case 1:      *to = *from++;
           } while (--n > 0);
}
// original code
int a[10];
a[5] = 3;

// optimized code
int a[10];
*(a + 5) = 3;