我怎样才能让这个功能更有效率。目前运行时间为 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/