数百万条记录的阵列性能

时间:2019-06-05 10:58:56

标签: c#

我有2个大小相等的数组,我想通过循环执行一些逻辑。它适用于小型数组,但当我在数组中加载数百万个项目时挂起

我尝试使用Parallel.ForEach但那里没有运气。这是我的代码

for (int i = 0; i < items1.Length - 1; i++)
    {
       for (int j = i + 1; j < items1.Length; j++)
         {
           if (((items1[i] < items1[j]) & (items2[i] < items2[j])) | ((items1[i] > items1[j]) & (items2[i] > items2[j])))
                    {
                        values1++;
                    }
            else if (((items1[i] > items1[j]) & (items2[i] < items2[j])) | ((items1[i] < items1[j]) & (items2[i] > items2[j])))
                    {
                        values2++;
                    }
                }
            }

当数组中的数据超过一百万时,如何重新编写此代码以提高性能?

1 个答案:

答案 0 :(得分:0)

有了并行性和一些小的优化,它快了将近4倍。

Random random = new Random(0);
int[] items1 = Enumerable.Range(1, 5000)
    .OrderBy(n => random.Next()).ToArray(); // Suffled numbers 1-5000
int[] items2 = Enumerable.Range(1, 5000)
    .OrderBy(n => random.Next()).ToArray(); // Suffled numbers 1-5000
long values1 = 0;
long values2 = 0;

var options = new ParallelOptions()
    { MaxDegreeOfParallelism = Environment.ProcessorCount };
Parallel.For(0, items1.Length - 1, options,
() => (0L, 0L),
(i, state, local) =>
{
    var (localValues1, localValues2) = local;
    var items1_i = items1[i];
    var items2_i = items2[i];
    for (int j = i + 1; j < items1.Length; j++)
    {
        var items1_j = items1[j];
        var items2_j = items2[j];
        if (((items1_i < items1_j) && (items2_i < items2_j))
            || ((items1_i > items1_j) && (items2_i > items2_j)))
        {
            localValues1++;
        }
        else if (((items1_i > items1_j) && (items2_i < items2_j))
            || ((items1_i < items1_j) && (items2_i > items2_j)))
        {
            localValues2++;
        }
    }
    return (localValues1, localValues2);
}, local =>
{
    var (localValues1, localValues2) = local;
    Interlocked.Add(ref values1, localValues1);
    Interlocked.Add(ref values2, localValues2);
});
Console.WriteLine($"values1: {values1}, values2: {values2}");

输出:

  

values1:6282046,values2:6215454