并行循环给出了较小的性能增益,如何优化?

时间:2014-04-09 13:59:05

标签: c# performance parallel-processing plinq

我有以下代码,它实际上将CSV序列化为对象。我尝试使用Foreach和Parallelism,但我得到了一点点好处。我想知道如何优化此代码以更好地利用并行处理功能。我有8GB内存的i7,并在csv字符串中处理1000-2000条记录。

    private List<Summary> deserializeCSV(string pSource, int pageSize)
    {
        List<Summary> ret = new List<Summary>(pageSize);

        string[] lines = pSource.Split(new char[] { '\n' });

        Parallel.For(1, lines.Length - 1, i =>
        {
            string[] col = lines[i].Split(',');
            ret.Add(new Summary
            {
                Complaint_Type = col[0],
                Product = col[1],
                ProductGroup = col[2],
                Brand = col[3],
                Each_UPC = col[4],
                SUBJECTCATEGORY_DESC = col[5],
                GROUP_DESC = col[6],
                SUBGROUP_DESC = col[7],
                SUBJECT_DESC = col[8],
                State = col[9],
                CITY = col[10],
                FullZip = col[11],
                Zip = col[12],
                IssueDate = DateTime.Parse(col[13]),
                ComplaintsCount = Single.Parse(col[14]),
                Gender = col[15],
                AgeBucket = col[16],
                Population = Single.Parse(col[17]),
                _RowID = int.Parse(col[18]),
                _RowIDComp = int.Parse(col[19]),
                ComplaintsCount_New = Single.Parse(col[20]),
                Population_New = Single.Parse(col[21]),
                Country = col[22],
                _ID = long.Parse(col[23]),
                C40_CODE = col[24]
            });
        });

        return ret;
    }

我观察到,如果我没有添加de-serilized对象[意味着而不是ret.Add(new Summary,var temp = new Summary)到我的可退回列表中(但只分配值),它给了我更好的性能。这个初始化List ret = new List(pageSize);还是别的什么?

修改-1 我的方案是我有一个包含内存页面的csv,我必须处理这些页面以从中提取一些摘要信息。这是一项耗时的任务,我希望使用并行处理来优化处理时间。

1 个答案:

答案 0 :(得分:2)

首先,该代码不是线程安全的。 如果 Parallel.For决定使用多个线程(这是正确的,它也可能决定不这样做),你将有几个线程访问同一个列表,它本身不是线程安全的。例如,您应该使用ConcurrentBag<T>

其次,我认为这种工作不值得并行化。按顺序执行它需要多长时间?毫秒?你只是解析字符串和创建对象,没有昂贵的计算。