Dapper.NET과 같은 Entity Framework 6의 성능을 극대화하십시오.

c# crud dapper entity-framework performance

문제

micro-orm으로 dapper.net을 사용하여 속도와 성능이 환상적입니다!

Dapper의 간단한 CRUD 작업은 Entity Framework 6보다 빠릅니다.

속도 비교 - 대퍼 대 엔티티 - 프레임 워크

그러나 Dapper와 같은 Entity Framework 6의 속도와 성능을 원한다면 어떻게해야합니까?

Entity Framework 6의 모든 고급 기능이 필요하지 않습니다.

Entity Framework 6의 속도와 성능을 향상시키기 위해 일부 기능을 비활성화 할 수 있습니까? 어느 것 ?

비용이 많이 드는 기능과 사용을 중지하는 속도가 증가하는 기능은 무엇입니까? (명시 해주세요)

수락 된 답변

먼저 Entity Framework에서 발행 한 SQL 명령을 프로파일 링해야합니다. 구성 (POCO, 자체 추적 엔티티)에 따라 최적화 할 여지가 많이 있습니다. ObjectSet<T>.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는 실제로 당신이 쿼리에 대해 알고있는 모든 것을 말하면 좋은 최적화를 수행합니다 (이 경우 우리는 카테고리가 필요할 것입니다 - 이름). 그러나 투영으로 인해로드 할 데이터의 양이 더 줄어들 수 있기 때문에 eager-loading (db.Products.Include ( "Categories"))과 다릅니다.


인기 답변

이 문제는 사실 Entity Framework와 같은 제품이 더 많은 코드를 실행하기 때문에 느리고 비효율적 일 수 있습니다.

또한 사람들이 LINQ 쿼리를 최적화하고, 생성 된 SQL을보고, 디버거를 사용하고, 미리 컴파일하고, 많은 추가 단계를 수행해야한다는 등의 제안은 바보처럼 느껴집니다. 즉 많은 시간을 낭비합니다. 아무도 말하지 않습니다 - 단순화하십시오! 모두는 더 많은 단계 (시간 낭비)를 취함으로써 사물을 더욱 복잡하게 만들고 싶어합니다.

일반적인 상식 접근법은 EF 또는 LINQ를 전혀 사용하지 않는 것입니다. 일반 SQL을 사용하십시오. 거기에 아무 문제가 없습니다. 프로그래머들 사이에 무리가 있다는 이유만으로 모든 단일 신제품을 사용하려는 충동을 느끼지 않는다고해서 그것이 훌륭하거나 효과가 있다는 것을 의미하지는 않습니다. 대부분의 프로그래머들은 대기업에서 출시 한 코드를 새로 통합 할 경우 더 똑똑한 프로그래머로 만들고 있다고 생각합니다. 전혀 사실이 아니다. 스마트 프로그래밍은 두통, 불확실성을 최소화하고 최소한의 시간으로 더 많은 일을 수행하는 방법에 관한 것입니다. 기억해 - 시간! 이것이 가장 중요한 요소이므로, 이상한 소위 '패턴'에 부합하도록 작성된 불량 / 비 대한 코드의 문제를 해결하는 데 낭비하지 않는 방법을 찾으십시오.

휴식을 취하고 삶을 즐기고 코딩을 중단하고 추가 기능, 코드, 제품, 패턴을 사용하는 것을 중지하십시오. 인생은 짧고 코드의 수명은 훨씬 짧으며 확실히 로켓 과학이 아닙니다. LINQ, EF 및 기타와 같은 레이어를 제거하면 코드가 효율적으로 실행되고 크기가 조정되며 그래도 유지 관리가 쉽습니다. 너무 많은 추상화는 나쁜 '패턴'입니다.

그리고 그것은 당신의 문제에 대한 해결책입니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow