帮助优化整数数学

Tes*_*rex 4 c# math optimization

我需要一些帮助来优化数学重码的一部分.我已完成分析,并隔离了慢速方法.问题是单独的线路并不慢,但它们被称为很多次,所以我需要在这里捏微秒.

此代码用于在执行NTSC过滤后转换像素数据.我已经在行旁边提供了性能分析数据作为总运行时间的百分比,因此您可以看到需要工作的内容.这个功能总共约占我运行时间的一半(自我占48%,有孩子占53%).

// byte[] ntscOutput;
// ushort[] filtered; - the pixels are ushort, because of the texture color depth

int f_i = 0;
int row = 0;
for (int i = 0; i < 269440; i++)                                  // 3.77 %
{
    int joined = (ntscOutput[f_i + 1] << 8) + ntscOutput[f_i];    // 6.6 %
    f_i += 2;                                                     // 1.88 %

    filtered[i] = (ushort)joined;                                 // 2.8 %

    ushort red = (ushort)(joined & 0xf800);                       // }
    ushort green = (ushort)(joined & 0x7e0);                      //  > 2.36 % each
    ushort blue = (ushort)(joined & 0x1f);                        // }

    red = (ushort)((red - (red >> 3)) & 0xf800);                  // }
    green = (ushort)((green - (green >> 3)) & 0x7e0);             //  > 4.24 % each
    blue = (ushort)((blue - (blue >> 3)) & 0x1f);                 // }

    filtered[i + 602] = (ushort)(red | green | blue);             // 5.65 %

    row++;
    if (row > 601)
    {
        row = 0;
        i += 602;
    }
}
Run Code Online (Sandbox Code Playgroud)

我对任何优化方法持开放态度.如果真的不可能改进实际的数学运算,那么使用不安全代码和指针的东西可能会在操作数组时起作用,以防止这么多的强制转换?也许以某种方式更改我的数组类型,或者可能某种循环展开?我有信心这是可能的,因为过滤操作本身就是一个庞大的C库函数,有大量的循环和数学,整个过程总计占我运行时间的1.35%.

Mar*_*mić 5

您要求进行微优化,但您是否首先尝试过宏优化?

269440可被任何2 ^ n整除,这意味着您可以轻松地将此代码线程化为您拥有的处理器数量,并且基本上具有n-tupled的速度.

请确保不要在此代码中声明线程.

使用未经检查的关键字的微优化可能可以在rgb块中实现,通过使用未经检查的{}包围所有内容,但这可能不会有太大帮助.

真正的优化是:

对于joined(ushort)的所有可能值,将所有结果值存储filtered[i + 602]到一个数组中,每个数组的索引都是(ushort)连接,并且不使用计算,而是直接从数组中获取值.

然后跳过rgb部分并用作循环体:

filtered[i] = (ushort)joined;
filtered[i+602] = precalculatedValues[(ushort)joined];
Run Code Online (Sandbox Code Playgroud)

您可以通过这种方式将join连接到ushort(删除按位操作后).