你好,我有一个代表二维数组的一维数组。根据每个值的位置确定它乘以的系数。
此刻,我迭代for循环中的每个值,乘以正确的系数,然后将产品存储在另一个数组中。
MultiplyEachValue.cs
internal double[] MultiplyEachValue(double[] oneDimArray, int width, int height, Alignment coeffs)
{
var toReturn = new double[oneDimArray.Length];
for (int i = 0; i < oneDimArray.Length; i++)
{
double curVal;
if(isEvenPos(i, width, height) == true)
{
curVal = coeffs.Small * oneDimArray[i];
}
else if (isOddPos(i, 4, 2) == true)
{
curVal = coeffs.Large * oneDimArray[i];
}
else if (isOppoPos(i, 4, 2) == true)
{
curVal = coeffs.Medium * oneDimArray[i];
}
else
{
curVal = 1;
}
toReturn[i] = curVal;
}
return toReturn;
}
知道如何让它更快吗? 我听说过点乘法之类的东西,但我不知道它是否可以在这里应用。任何建议都会很棒。感谢!!!
答案 0 :(得分:1)
您应该使用分析来运行应用程序,理想情况下使用大量输入以便需要更长时间。然后确定热点,然后查看这些热点以确定它们是否可以改进。
另外请注意,执行时间和CPU消耗时间也是不同的。您是在寻求降低CPU成本还是节省时间?
您还应该先命令if / else梯形图测试最常见的场景,例如,如果大多数数据在最后一次if测试中结束,那么将该检查作为第一次检查将改进。
话虽如此,代码看起来很容易并行化,并且在多核机器上你可以 - 原则上 - 看到&#39; n&#39;因素加速&nbsp;&#39; n&#39;如果你并行化循环核心。
答案 1 :(得分:1)
(这个问题似乎非常适合code review。)
具有单个(单维)数组并不意味着嵌套循环不是有利的
假设“行顺序”(并保持我对识别值的不同做法):
double[] MultiplyEachValue(double[] oneDimArray,
int width, int height, Alignment coeffs)
{
var toReturn = new double[oneDimArray.length];
const double
even = coeffs.Small,
opposed = coeffs.Medium,
odd = coeffs.Large;
for (int i = 0, r = 0 ; r < height ; r++) {
for (int c = 1 ; c < width ; c += 2) {
toReturn[i] = even * oneDimArray[i]; i++;
toReturn[i] = opposed * oneDimArray[i]; i++;
}
if (1 == (1 & width)) {
toReturn[i] = even * oneDimArray[i]; i++;
}
if (height <= ++r)
return toReturn;
for (int c = 1 ; c < width ; c += 2) {
toReturn[i] = opposed * oneDimArray[i]; i++;
toReturn[i] = odd * oneDimArray[i]; i++;
}
if (1 == (1 & width)) {
toReturn[i] = opposed * oneDimArray[i]; i++;
}
}
return toReturn;
}
(可以想象,1 & width
在MultiplyEachValue()
的任何给定调用期间没有太大变化,因此可以一次性评估 - 你甚至可以有两个版本的外循环欲望来避免检查每一行中的奇数列。或者复制“偶数行处理”,如“偶数列处理”所示。)
(代码是从Java中的一个草率POP中“重新调整” - 我一直忘记在线C#游乐场。)