【发布时间】:2011-06-20 03:44:59
【问题描述】:
我需要一些帮助来优化一段数学繁重的代码。我已经完成了分析,并隔离了慢速方法。问题是单独的行并不慢,但是它们被调用了很多很多次,所以我需要在这里真正捏紧微秒。
此代码用于在执行 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;
}
}
我愿意接受任何优化方法。如果真的不可能改进实际的数学运算,也许一些带有不安全代码和指针的东西可以在操作数组时起作用,以防止这么多的强制转换?也许以某种方式改变我的数组类型,或者某种循环展开?我相信这是可能的,因为过滤操作本身是一个巨大的 C 库函数,其中包含大量循环和数学运算,整个过程总共占用了我运行时间的 1.35%。
【问题讨论】:
-
如果演员确实扮演重要角色,也许您可以将
joined设为ushort?即使事实证明它对性能没有任何积极影响,它至少应该让你的代码不那么糟糕。 -
@zneak 我会,但是每个数学运算都会再次返回一个 int,所以我仍然需要所有这些演员表。这真的让我很恼火,所以我希望演员们不会为他们付出任何代价。
-
嗯,我以为他们返回了使用的最大类型,但你是对的。在这种情况下,也许您可以在任何地方使用
ints,直到您需要转换为filtered?
标签: c# math optimization