c# - 重构 - 速度提升

标签 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 

我可以做些什么来加快这个方法吗?它被调用了很多次,秒数加起来:

    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;
    }

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

报表数据

ReportID            int

ReportDataColumn

ReportDataColumnId  int
ReportDataId        int 
Name                varchar(255)    
Value               text    

最佳答案

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

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

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

关于c# - 重构 - 速度提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2968857/

相关文章:

c# - 添加到 IEnumerable 的代码

linq - Linq查询获取计数

python - 更好的方法来测试功能

c# - System.InvalidCastException : Specified cast is not valid. 错误

javascript - 使用 peta poco ORM 在 MVC 应用程序中创建选择列表

java - 在 Eclipse 中重命名和重构类,并保留 SVN 历史记录

asp.net-mvc - MVC Controller 中重构和处理非异常错误的设计模式

c# - 打印学生记录 : I want to show every record on a different page

c# - RadAsyncUpload 抛出 HTTP 500,并在上传的文件名旁边显示一个红点

c# - 对特别影响少数表的数据库的特别关注/设置