【问题标题】:Hilarious [Or Not So Hilarious] Code Optimizations搞笑 [或不那么搞笑] 代码优化
【发布时间】:2008-11-28 00:59:03
【问题描述】:

Raymond Chen 在他最近关于代码优化的post 中这么说...如果您考虑到所有需要考虑的因素,那么明显的优化 - 一个需要优化的优化 - 往往是“去优化”。 .

我相信你一定遇到过/甚至在你了解更多之后感到尴尬的编码优化......

愿意分享吗?

【问题讨论】:

    标签: optimization


    【解决方案1】:

    Duff's Device,它是如此扭曲以至于它看起来甚至不应该在 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);
    }
    

    【讨论】:

    • 啊,半展开循环的乐趣。 =]
    • 这种设备令人憎恶,在当今高速大地址空间计算机的世界中没有一席之地。当然,这很酷,以一种书呆子的方式,但非常不必要。
    • ... 因此它包含在可恶的代码优化列表中。我并不完全提倡通过在此线程中发布它来使用它!!!
    • +1,并在我的“意大利面条代码”问题中添加了一个指针。我以前从未见过这颗珍珠
    【解决方案2】:

    我最喜欢的例子是XOR swap algorithm

    // swap these two values:
    int x = 4;
    int y = 2;
    // original:
    int temp = x;
    x = y;
    y = temp;
    // optimized version:
    x ^= y;
    y ^= x;
    x ^= y;

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

    【讨论】:

    • 这对我来说是一个特别的烦恼——人们降低了代码的可读性,因为,天哪,他们不想在堆栈中添加额外的 4 个字节。什么,这些人是在 Intel 4004 还是 RCA 1802 CPU 上运行的?
    • 我认为现在的一些编译器可以检测和优化第一种情况。
    • 这种“优化”增加了数据依赖,原始数据可以通过寄存器重命名由硬件处理。事实上,原版很可能需要 个周期。
    • @Luke:它适用于任何值。当然 XOR 必须将值视为整数。
    • 因为在第 1 行完成之前第 2 行无法执行,而在第 2 行完成之前第 3 行无法执行。所以CPU会长时间爆炸然后停止并走“1,2,3”然后继续前进。相反,x = yy = temp 可以同时执行。
    【解决方案3】:

    我最喜欢的是

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

    是的,突然之间,速度快得惊人!!</sarcasm>

    【讨论】:

    • 其实应该是"int a[10]; a += 5; *(a+N) = 3;"因为,平均而言,CPU 从数组中间到达给定元素的速度更快。如果你想要 a[9],它必须使用原始解决方案从 0 一直计数。在我的优化中,它最多只能数 5 :-)
    • 哦,是的,指针数学。我很高兴改用托管语言的另一个原因。
    • @pax, a+=5 不起作用,因为指向数组的指针无法更改。
    猜你喜欢
    • 2010-09-10
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多