C# 并行性和数组?运行时定义的对运行时定义的元素子组的计算量

C# 并行性和数组?运行时定义的对运行时定义的元素子组的计算量,c#,performance,linq,asynchronous,C#,Performance,Linq,Asynchronous,我有一个未定义的元素数量小于一个长的大小,我必须对其中一些元素执行运行时数量的计算操作,元素位置作为参数接收 然后,参数、位置数和列表指令将其添加到从X到Y的位置,将其减去从p到Q的位置 我的解决办法是: 根据args接收到的长度,将列表输出填入0 长输出[]=output.ToArray Instructions.ForEachop=>DooOperationsSOP; op从什么位置到什么位置我必须用什么数字做什么计算 A用于对输出[]的每个过滤位置进行计算 现在的问题是时间限制使得这一切都

我有一个未定义的元素数量小于一个长的大小,我必须对其中一些元素执行运行时数量的计算操作,元素位置作为参数接收

然后,参数、位置数和列表指令将其添加到从X到Y的位置,将其减去从p到Q的位置

我的解决办法是:

根据args接收到的长度,将列表输出填入0

长输出[]=output.ToArray

Instructions.ForEachop=>DooOperationsSOP; op从什么位置到什么位置我必须用什么数字做什么计算

A用于对输出[]的每个过滤位置进行计算

现在的问题是时间限制使得这一切都不可行,所以我需要一个异步/WhenAll来执行,但我也需要所有人共享输出,以便他们都可以对其进行操作,这不是先解决哪个操作的问题。异步中没有ref或out参数

最有效、最干净的方法是什么

@编辑以显示并行的工作方式:

static long arrayManipulation(int n, int[][] queries) 
    {
        long[] operate;
        for(long i=0;i<n;i++) 
            lOperate.Add(0);

        operate = lOperate.ToArray();
        List<int[]> lQueries = new List<int[]>(queries.ToList<int[]>());    
        Parallel.ForEach(lQueries, op=>
        {
            Parallel.For(op[0]-1, op[1], i=> (operate[i]+= (long)op[2]));
        });
        return operate.Max();
    }

如果没有关于问题规模的任何信息,很难尝试优化,但是一些快速测试表明并行运行add操作是不值得的。设置Parallel.For和调用lambda方法会有一些开销,这会占用只使用基本For循环和加法的时间

OTOH,使用外部并行。对于我来说,在多核CPU上逐步完成这些操作是值得的,在我的计算机上运行速度至少要快四倍。将内部循环展开几次以批处理操作似乎在2x和4x时没有优势。使用标准LINQ Max操作符仅占总时间的0.2%,因此在操作期间尝试跟踪Max似乎不值得

因此,我的建议是:

Parallel.For(0, operations.Length, j1 => {
    var op = operations[j1];
    for (int j2 = op[0]; j2 < op[1]; ++j2)
        operate[j2] += op[2];
});
var ans = operate.Max();

这听起来像是一个编程挑战,我相信诀窍是不实际拥有所有的值,而是跟踪子集。所以,如果它是100个值,并且你被告知将1添加到位置5到9,那么你所需要的就是存储0-4是0,5-9是1,10-99是0。在执行更多操作时保持分区。除非您实际上在代码之外调用内容,否则您可以等待文件访问,http调用等使用Parallel.ForEach不是更好吗?此外,我不认为您可以将其并行化,因为我假设必须执行这些操作才能获得正确的结果。async/WhenAll用于I/O操作,如发出web请求或查询数据库或文件系统。似乎您有CPU限制的操作,所以您真正需要的是异步,而不是异步。老实说,我认为您对问题的看法是错误的。但首先让我注意到,在你开始计算之前,有很多非常低效的代码。例如,您可以这样做:var operate=new long[n];这将为您提供一个长度为n的数组,所有值都设置为0。此外,您还可以直接对查询进行操作。也就是说,我不会把它看作是单个元素的补充,而是高度范围。然后创建一个“天际线”,并检查它的最高点。