Как сделать эту функцию более эффективной. Он работает в течение 6 - 45 секунд. Я пропустил профайлер dotTrace по этому конкретному методу, и это общее время в пределах от 6000 мс до 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 здесь они:
ReportData
ReportID int
ReportDataColumn
ReportDataColumnId int
ReportDataId int
Name varchar(255)
Value text
Почему метод называется 190 раз? Это называется ненужным (вы могли бы назвать это раньше и кэшировать результаты)? Это 190 отчетных отчетов, которые можно обрабатывать параллельно? – Greg
Да, это 190 отдельных отчетов, которые я объединяю в одну таблицу. Каждый отчет может иметь разные имена столбцов, но есть много перекрывающихся имен. –
Просто, чтобы быть ясным, это Linq2Sql или что-то в этом роде? И какую версию .NET вы используете? –