首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重构-提速

重构-提速
EN

Stack Overflow用户
提问于 2010-06-03 18:50:09
回答 5查看 477关注 0票数 5

怎样才能使这个功能更有效率。它现在以6-45秒的速度运行。我已经运行了这个特定方法的dotTrace分析器,它的总时间在6,000到45,000 is之间。大部分时间用于"MoveNext“和"GetEnumerator”调用。

时代的例子是

代码语言:javascript
复制
71.55% CreateTableFromReportDataColumns - 18, 533* ms - 190 calls
 -- 55.71% MoveNext - 14,422ms - 10,775 calls 

我能加快速度吗?它经常被调用,而秒加起来:

代码语言:javascript
复制
    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

代码语言:javascript
复制
ReportID            int

ReportDataColumn

代码语言:javascript
复制
ReportDataColumnId  int
ReportDataId        int 
Name                varchar(255)    
Value               text    
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-06-03 19:01:24

我相信你应该能够把你的函数简化成这样的东西

代码语言:javascript
复制
var columnsToAdd = report.ReportDatas
                    .SelectMany(r => r.ReportDataColumns)
                    .Select(rdc => rdc.Name)
                    .Distinct()
                    .Where(name => !string.IsNullOrEmpty(name));

然后把名字加到你的桌子上。

票数 4
EN

Stack Overflow用户

发布于 2010-06-03 19:02:14

您的代码(仅)运行foreach循环,因此,该方法将大部分时间用于MoveNext()等方面的结论并不令人惊讶。

您正在对isnullOrEmpty和Distinct进行双重工作(由HashSet重复)。

我的版本是:

代码语言:javascript
复制
private static DataTable CreateTableFromReportDataColumns(Report report)
{
    DataTable table = new DataTable();
    HashSet<String> colsToAdd = new HashSet<String> { "DataStream" };
    foreach (ReportData reportData in report.ReportDatas)
    {

        foreach (var column in reportData.ReportDataColumns)
        {
            if (!String.IsNullOrEmpty(column.Name))
                colsToAdd.Add(column.Name);
        }
    }

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

    return table;
}

但我不认为会有很大的进步

票数 3
EN

Stack Overflow用户

发布于 2010-06-04 02:37:18

当你问这个问题时,你应该提到LinqToSql,然后你会得到一些回复来查看你的数据库,看看它是一个长时间运行的查询,还是重复的查询

代码语言:javascript
复制
private static DataTable CreateTableFromReportDataColumns(Report report) 
{ 
    DataTable table = new DataTable(); 
    table.Columns.Add("DataStream");
    IEnumerable<string> moreColumns = report.ReportDatas
      .SelectMany(z => z.ReportDataColumns)
      .Select(x => x.Name)
      .Where(s => s != null && s != "")
      .Distinct();

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

    return table; 
} 

另外,捕获使用sql分析器发出的查询。然后,通过使用前面的语句来分析查询的IO和时间。

代码语言:javascript
复制
SET STATISTICS TIME ON
SET STATISTICS IO ON
  --your query here

最后,您可能需要一个或两个索引来降低IO。列顺序在这里很重要。

代码语言:javascript
复制
CREATE INDEX IX1_ReportData ON ReportData(ReportID, Id)
CREATE INDEX IX1_ReportDataColumn ON ReportDataColumn(ReportDataId, Name)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2968857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档