重构 - 速度提升

Mic*_*l G 5 c# linq refactoring profiling

我怎样才能使这个功能更有效率。目前运行时间为 6 - 45 秒。我已经在这个特定方法上运行了 dotTrace profiler,它的总时间在 6,000 毫秒到 45,000 毫秒之间。大部分时间花在“MoveNext”和“GetEnumerator”调用上。

时代的例子是

71.55% CreateTableFromReportDataColumns - 18, 533* ms - 190 calls
 -- 55.71% MoveNext - 14,422ms - 10,775 calls 
Run Code Online (Sandbox Code Playgroud)

我可以做些什么来加快这个方法的速度吗?它被多次调用,并且秒数加起来:

    private static DataTable CreateTableFromReportDataColumns(Report report)
    {
        DataTable table = new DataTable();
        HashSet<String> colsToAdd = new HashSet<String> { "DataStream" };
        foreach (ReportData reportData in report.ReportDatas)
        {
            IEnumerable<string> cols = reportData.ReportDataColumns.Where(c => !String.IsNullOrEmpty(c.Name)).Select(x => x.Name).Distinct();

            foreach (var s in cols)
            {
                if (!String.IsNullOrEmpty(s))
                    colsToAdd.Add(s);
            }
        }

        foreach (string col in colsToAdd)
        {
            table.Columns.Add(col);
        }

        return table;
    }
Run Code Online (Sandbox Code Playgroud)

如果您需要此处的 sql 表定义,它们是:

报告数据

ReportID            int
Run Code Online (Sandbox Code Playgroud)

报表数据栏

ReportDataColumnId  int
ReportDataId        int 
Name                varchar(255)    
Value               text    
Run Code Online (Sandbox Code Playgroud)

Ant*_*ram 4

我相信你应该能够将你的功能简化成这样

var columnsToAdd = report.ReportDatas
                    .SelectMany(r => r.ReportDataColumns)
                    .Select(rdc => rdc.Name)
                    .Distinct()
                    .Where(name => !string.IsNullOrEmpty(name));
Run Code Online (Sandbox Code Playgroud)

然后将名称添加到您的表中。

  • @Rubens:另一方面,尽早进行测试将减少后续操作必须处理的数据量。这也是应该对标的事情。 (2认同)