현재 웹 응용 프로그램의 저장소 인 db4o 사용에 대한 조사를하고 있습니다. 나는 db4o가 얼마나 쉽게 작동 하는지를 매우 기쁘게 생각합니다. 그래서 EF4 Code First로 작업하는 방법이 db4o로 작업하는 것과 매우 비슷하기 때문에 내가 좋아하는 Code First 접근법에 대해 읽었을 때 도메인 객체 (POCO 's)를 만들고 db4o에서 던져 버리고 결코 되돌아 보지 마십시오.왜 EF4 코드가 먼저 객체를 저장할 때 느린가요?
하지만 성능 비교를했을 때 EF 4는 매우 느립니다. 그리고 그 이유를 알 수 없었습니다.
내가 다음 엔터티 사용
public class Recipe { private List _RecipePreparations; public int ID { get; set; } public String Name { get; set; } public String Description { get; set; } public List Tags { get; set; } public ICollection Preparations { get { return _RecipePreparations.AsReadOnly(); } }
public void AddPreparation(RecipePreparation preparation)
{
this._RecipePreparations.Add(preparation);
}
}
공용 클래스 RecipePreparation { 공공 문자열 이름을 {얻을; 세트; } 공용 문자열 설명 {get; 세트; } public int Rating {get; 세트; } 공개 목록 Steps {get; 세트; } 공개 목록 태그 {get; 세트; } public int ID {get; 세트; } }
나는 조리법을 새로운 성능을 테스트하고, 50.000 RecipePrepations를 추가합니다. 그럼 난과 같이 db4o는에 객체를 저장 :
cookRecipes.Recipes.Add(recipe1);
cookRecipes.SaveChanges();
:
IObjectContainer db = Db4oEmbedded.OpenFile(Db4oEmbedded.NewConfiguration(), @"RecipeDB.db4o");
db.Store(recipe1);
db.Close();
이이 같은 약 13.000 (MS) (로컬 익스프레스,) 내가 SQL Server 2008의 EF4로 물건을 저장
소요
그리고 그게 200.000 (ms) 걸립니다
이제 어떻게 지구상에서 db4o 15 (!!!) 번 EF4/SQL 빠른 무엇입니까? EF4 용 비밀 터보 버튼이 누락 되었습니까? 나는 심지어 db4o가 더 빨라질 수 있다고 생각합니까? 데이터베이스 파일을 초기화하지 않으므로 동적으로 커지게 만듭니다.
내 생각 엔이 많은 단일 삽입 명령문의 오버 헤드 차이의 가장 큰 부분입니다 실행되는 것입니다. 그 오버 헤드를 줄이기 위해 EF4에 insert 문을 결합하도록 지시하는 방법이 있습니까? –
@Lasse : 예, 있습니다. EF는 작업 단위 패턴을 상자 밖으로 구현합니다. 제 답변을 참조하십시오. –
Visual Studio에서 프로파일 링을 수행했습니다. 그리고 cookRecipes.Recipes.Add (recipe1)는 총 저장 시간의 약 65 %를 저장하고 SaveChanges는 약 35 %를 소비합니다 (duh ...;)). – Saab