双数组值的更快乘法

时间:2017-07-06 21:57:31

标签: c# arrays multiplication

你好,我有一个代表二维数组的一维数组。根据每个值的位置确定它乘以的系数。

此刻,我迭代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;
}

知道如何让它更快吗? 我听说过点乘法之类的东西,但我不知道它是否可以在这里应用。任何建议都会很棒。感谢!!!

2 个答案:

答案 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 & widthMultiplyEachValue()的任何给定调用期间没有太大变化,因此可以一次性评估 - 你甚至可以有两个版本的外循环欲望来避免检查每一行中的奇数列。或者复制“偶数行处理”,如“偶数列处理”所示。)
(代码是从Java中的一个草率POP中“重新调整” - 我一直忘记在线C#游乐场。)