0

所以,我正在制作一个 Hack CPU 模拟器,我想知道计算输出的最佳方法是什么。将输出计算压缩为一行不可读的行会比一次计算结果更有效吗?编译器是否对其进行了优化以使两个选项都可以?基本上,哪一个更有效——

这:

    word HackALU(word x, word y, bool zx, bool nx, bool zy, bool ny, bool f, bool no)
    {
        x = zx ? 0:x;
        y = zy ? 0:是的;

        x = nx ? 〜x:x;
        y = y ? 〜y:是的;

        单词结果 = f ? x + y : x & y;

        返回不?〜结果:结果;    
    }

或这个:

    word HackALU(word x, word y, bool zx, bool nx, bool zy, bool ny, bool f, bool no)
    {
        返回不?〜(f?((nx?〜(zx?0:x):(zx?0:x))+(ny?〜(zy?0:y):(zy?0:y))):(( nx ? ~(zx ? 0 : x) : (zx ? 0 : x)) & (ny ? ~(zy ? 0 : y) : (zy ? 0 : y)))) : (f ? ((nx ? 〜(zx?0:x):(zx?0:x))+(ny?〜(zy?0:y):(zy?0:y))):((nx?〜(zx?0: x) : (zx ? 0 : x)) & (ny ? ~(zy ? 0 : y) : (zy ? 0 : y))));
    }
4

3 回答 3

1

一个好的现代编译器很可能会为两者生成相同的代码。

于 2012-03-20T19:17:00.397 回答
1

逻辑更改将对代码的性能产生更大的影响,而不是空白/临时存储。

例如,某些机器没有分支预测(例如 PS3 SPU),在这种情况下,通过用数学运算替换分支,您的代码肯定会更快

word HackALU(word x, word y, bool zx, bool nx, bool zy, bool ny, bool f, bool no)
{
    x = (zx == 0) * x; // [0 or 1] * x;
    y = (zy == 0) * y;

    x -= (nx != 0) * 2 * x;
    y -= (ny != 0) * 2 * x;

    word result = (f != 0) * (x + y) + (f == 0) * (x & y);

    return (no != 0) * ~result + (no == 0) * result;    
}
于 2012-03-21T17:37:35.053 回答
0

使用这个循环,我实际上展示了顶级版本更快:

int n = 0; //optimization busting counter
clock_t start = clock();
    for( word x=0; x<1000; ++x ) {
    for( word y=0; y<1000; ++y ) {
        for( int b = 0; b < 64; ++b ) {
            n += HackALU(x,y,b&0x1,b&0x2,b&0x4,b&0x8,b&0x10,b&0x20);
}   }   }
clock_t end = clock();
printf("finished, elapsed ticks = %d, n = %d\n", end - start, n);

很明显,除非优化器非常好,否则顶级版本的指令会更少......我认为让它更快需要减少分支或确保准确预测它们。

于 2012-03-21T16:46:10.720 回答