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%.
您要求进行微优化,但您是否首先尝试过宏优化?
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(删除按位操作后).
| 归档时间: |
|
| 查看次数: |
252 次 |
| 最近记录: |