오브젝트의 ListCollections 이벤트 핸들러가 더 이상 필요하지 않은 오브젝트에 대한 참조를 유지 보수했기 때문에 CodeFluent에서 메모리 부족 문제가 발생했습니다. 해결책은 ListCollection 대신 Entity의 컬렉션 유형을 List로 변경하는 것이 었습니다. 이로 인해 메모리 누출 문제가 해결되었습니다.CodeFluent에서 List를 사용할 때 콜렉션이 느림
그러나 List가 ListCollection보다 훨씬 느리다는 것을 알았습니다. Codefluent는 객체가 이미 목록에 있는지 여부를 검사 할 때마다 객체를 목록에 추가합니다. 그러면 BaseContains 메서드가 실행됩니다. 91 %의 CPU가 여기에서 사용됩니다 (ANTS를 사용하여 프로파일 링). 핫 경로에 CPU 비율을 표시했습니다.
for (readerRead = reader.Read(); ((readerRead == true)
&& ((count < this.MaxCount)
&& (count < pageSize))); readerRead = reader.Read())
{
readCount = (readCount + 1);
if ((CodeFluent.Runtime.CodeFluentPersistence.CanAddEntity(pageIndex, pageSize, pageOptions, readCount) == true))
{
Runtime.CwObject cwObject = new Runtime.CwObject();
((CodeFluent.Runtime.ICodeFluentEntity)(cwObject)).ReadRecord(reader);
91% CPU >> if ((this.BaseContains(cwObject) == false))
{
this.BaseAdd(cwObject);
count = (count + 1);
}
cwObject.EntityState = CodeFluent.Runtime.CodeFluentEntityState.Unchanged;
}
}
이 호출 :
protected virtual bool BaseContains(Runtime.CwObject cwObject)
{
if ((cwObject == null))
{
return false;
}
91% CPU >> bool localContains = this.BaseList.Contains(cwObject);
return localContains;
}
이 호출
public virtual bool Equals(Runtime.CwObject cwObject)
{
if ((cwObject == null))
{
return false;
}
29% CPU >> if ((this.Guid.Equals(CodeFluentPersistence.DefaultGuidValue) == true))
{
return base.Equals(cwObject);
}
45% CPU >> return (this.Guid.Equals(cwObject.Guid) == true);
}
모든 방법이 빛을 보인다
함수 LoadByMainCwEntity는 다음과 같은 코드 블록을 포함하고 있습니다. 나는 문제가 히트작에 있다고 생각한다. 100.000 개의 객체 목록이 있고 Codefluent가 100.001을 추가하면 100,000 명의 다른 모든 객체를 검사하여 일치하는 것을 찾습니다. 컬렉션이 커지면 .Add 메소드가 기하 급수적으로 느려집니다.
Codefluent의 정상적인 '로드'작업에서 개체가 이미 컬렉션에 있는지 확인하는 것이 약간 이상한 것 같습니다. 어떤 해결 방법이 있습니까? 아니면 큰 목록이 Codefluent에서 실제로 느려지는 사실을 가지고 살아야합니까?
사실 나는 collections/list/100000+ objets가 무엇이든간에 조작하지 않을 것입니다.NET (관계형 데이터베이스가 강점이고 일련의 작업을 조작하는 것)이 있다면 BaseContains 호출을 제거하는 측면을 작성할 수 있습니다. 실제로 필요한 경우 병목 현상을 지적하므로 필요하지 않을 것입니다. (CodeFluent가 확신 할 수없는 것) –