C# 实体框架将查询结果具体化为实体花费了多少时间?

C# 实体框架将查询结果具体化为实体花费了多少时间?,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我是否可以测量EntityFramework从Db加载后具体化单个对象或对象列表所花费的时间 有什么建议吗 谢谢 你不能得到你想要的东西。但这是可以估计的。实体框架在执行查询时会执行多个操作,例如: 元数据加载 视图生成 参数评估 查询翻译 物化器生成 数据库查询执行 对象物化 身份查找 但是,当您执行热查询(第二次查询执行)时,大多数加载和生成将被以下查找所取代: 元数据查找 查看查找 参数评估 查询查找 物化器查找 数据库查询执行 对象物化 身份查找 在这种情况下,大多数步骤的成本都很低,除

我是否可以测量EntityFramework从Db加载后具体化单个对象或对象列表所花费的时间

有什么建议吗


谢谢

你不能得到你想要的东西。但这是可以估计的。实体框架在执行查询时会执行多个操作,例如:

  • 元数据加载
  • 视图生成
  • 参数评估
  • 查询翻译
  • 物化器生成
  • 数据库查询执行
  • 对象物化
  • 身份查找
  • 但是,当您执行热查询(第二次查询执行)时,大多数加载和生成将被以下查找所取代:

  • 元数据查找
  • 查看查找
  • 参数评估
  • 查询查找
  • 物化器查找
  • 数据库查询执行
  • 对象物化
  • 身份查找
  • 在这种情况下,大多数步骤的成本都很低,除了:

  • 数据库查询执行-可能很高
  • 对象物化-媒体
  • 身份查找-中等
  • 这里可以做的是执行热查询,计算所需时间,然后从总时间中减去查询执行时间并将其除以2(因为两个中间成本)。是的,我知道这将是一个非常粗略的结果,但从无到有会更好:)。以下是演示:

    // Let Entity Framework to load metadata, generate views and etc.
    using (TestContext context = new TestContext())
    {                
        var query = context.Set<Message>().AsNoTracking();
        Message first = context
            .Set<Message>()
            .AsNoTracking()
            .FirstOrDefault();
    }
    
    // Execute warm query
    using (TestContext context = new TestContext())
    {
        // Log the queries to be able to subtract query execution time.
        context.Database.Log = Console.WriteLine;
    
        var query = context.Set<Message>().AsNoTracking();
    
        Stopwatch stopwatch = new Stopwatch();
        stopwatch.Restart();
    
        Message first = query.FirstOrDefault();
    
        stopwatch.Stop();
        Console.WriteLine("Elapsed {0} milliseconds.", stopwatch.ElapsedMilliseconds);
    }
    
    //让实体框架加载元数据、生成视图等。
    使用(TestContext=newtestcontext())
    {                
    var query=context.Set().AsNoTracking();
    消息优先=上下文
    .Set()
    .AsNoTracking()
    .FirstOrDefault();
    }
    //执行热查询
    使用(TestContext=newtestcontext())
    {
    //记录查询以便能够减去查询执行时间。
    context.Database.Log=Console.WriteLine;
    var query=context.Set().AsNoTracking();
    秒表秒表=新秒表();
    stopwatch.Restart();
    Message first=query.FirstOrDefault();
    秒表;
    WriteLine(“经过的{0}毫秒。”,stopwatch.elapsedmillisons);
    }
    
    然后,您可以从总运行时间中减去查询执行时间(从日志中),并将其除以2


    有关更多信息,请参阅。

    我认为这是一种合理的方法。实体生成不仅仅包括生成CLR对象。关系修复也会发生(即使使用
    AsNoTracking
    ,我猜这是一个相对昂贵的过程。即使我们有合适的挂钩(我们没有),也很难获得所有这些步骤的详细测量值。黑盒方法是我们能得到的最好方法。感谢@GertArnold的支持)