Entity Framework速度过慢,有哪些选择?

22 浏览
0 Comments

Entity Framework速度过慢,有哪些选择?

已关闭。此问题正在寻求书籍、工具、软件库等建议。它不符合Stack Overflow指南。它目前不能接受答案。


我们不允许寻求书籍、工具、软件库等建议的问题。您可以编辑问题,以便回答使用事实和引文。

改进此问题

我遵循“不要过早优化”的口号,并使用Entity Framework编写了我的WCF服务。

然而,我调查了性能,发现Entity Framework太慢了。(我的应用程序在约1.2秒内处理2个消息,而我正在重写的(遗留)应用程序在同样的时间内处理5-6个消息。(遗留应用程序调用sprocs进行其DB访问。)

我的分析表明,每个消息的大部分时间都被Entity Framework占用。

那么,我的选择有哪些呢?

  • 是否有更好的ORM?

    (一些支持正常对象读写并且执行速度较快的东西..)

  • 有没有办法让Entity Framework加快速度?

    注意:当我说快速时,我指的是长期运行的,而不是第一次调用。(第一次调用很慢(15秒钟一个消息),但这不是问题。我只需要其余的消息快速处理。))

  • 一些神秘的第三种选择,可以帮助我从我的服务中获得更快的速度。

注意:我的大部分DB交互都是创建和更新。我很少选择和删除。

admin 更改状态以发布 2023年5月24日
0
0 Comments

您应该首先通过 Entity Framework 发出的 SQL 命令进行分析。根据您的配置(POCO,自跟踪实体),还有很大的优化空间。您可以使用 ObjectSet.ToTraceString() 方法调试 SQL 命令(在调试和发布模式之间不应该有任何区别)。如果您遇到一个需要进一步优化的查询,您可以使用一些投影,以便 EF 更好地了解您想要完成的操作。

例如:

Product product = db.Products.SingleOrDefault(p => p.Id == 10);
// executes SELECT * FROM Products WHERE Id = 10
ProductDto dto = new ProductDto();
foreach (Category category in product.Categories)
// executes SELECT * FROM Categories WHERE ProductId = 10
{
    dto.Categories.Add(new CategoryDto { Name = category.Name });
}

可以替换为:

var query = from p in db.Products
            where p.Id == 10
            select new
            {
                p.Name,
                Categories = from c in p.Categories select c.Name
            };
ProductDto dto = new ProductDto();
foreach (var categoryName in query.Single().Categories)
// Executes SELECT p.Id, c.Name FROM Products as p, Categories as c WHERE p.Id = 10 AND p.Id = c.ProductId
{
    dto.Categories.Add(new CategoryDto { Name = categoryName });
}

我刚才从脑海中打出了这个示例,因此这并不是实际执行的方式,但是如果您告诉 EF 关于查询的所有信息(在这种情况下,我们将需要分类名称),EF 实际上会进行一些很好的优化。但这并不像渴望加载(db.Products.Include("Categories")那样,因为投影可以进一步减少要加载的数据量。

0
0 Comments

事实是,像Entity Framework这样的产品将始终缓慢和低效,因为它们执行了更多的代码。
\n我也觉得有些愚蠢的是,有人建议优化LINQ查询,查看生成的SQL,使用调试器,预编译,采取许多额外的步骤等等,即浪费很多时间。没有人说 - 简化!每个人都想通过采取更多步骤(浪费时间)进一步复杂化问题。
\n一个常识性的方法是根本不使用EF或LINQ。使用普通的SQL也没有问题。只是因为程序员之间存在群体心态,他们感觉迫切需要使用每一个出现的新产品,这并不意味着这是好的或它会起作用。大多数程序员认为,如果他们将所有大公司发布的新代码都纳入其中,它会让他们成为更聪明的程序员。但实际上并不是这样。聪明的编程主要是关于如何在最少的时间内减少头痛和不确定性的做更多的事情。记住 - 时间!这是最重要的因素,所以要找到不浪费时间解决那些简单为了符合某些奇怪的所谓“模式”而编写的代码的问题的方法。
\n放松,享受生活,放下编码并停止使用额外的功能、代码、产品和“模式”。人生短暂,你的代码寿命更短,这当然不是什么火箭科学。去掉类似LINQ、EF等的层次结构,你的代码将高效、可扩展,并且很容易维护。过多的抽象是一个不好的“模式”。
\n这就是你问题的解决方案。

0