사용자가 특정 데이터 소스 (관심있는 사람들을 위해 Football Manager 2010 ingame 데이터베이스)에 쿼리 할 수있는 프레임 워크가 있습니다.이걸 어떻게 빨리 얻을 수 있습니까?
이 프레임 워크에서는 프레임 워크를 실행할 수있는 두 가지 모드 인 실시간 및 캐시 모드가 있습니다. 이 프레임 워크를 사용하는 사용자가 다른 생성자 (예 : new Context(Mode.Cached)
)를 호출하여 전환 할 수 있기를 바랍니다. 사용자가해야하는 유일한 스위치 여야합니다. 그래서 그는 여전히 모든 Linq 호출을 가질 수 있지만, 응용 프로그램이 더 적합 할 때 캐시 모드를 사용하십시오. 명확한.
나는 결정했다 그 때문에 PostSharp 내 최선의 선택을해야한다 사용 :
- 은 우리가 있는지 확인 모든 재산에 측면 (즉, 이미 속성에 의해 장식 된 것)이 측면에서
- 만들기
Cached
또는Realtime
모드 - 반환 값 중 하나를 메모리에서 또는 작동 캐시
음에서. 그러나! 속도가 충분하지 않습니다. 일을 할 때 90.000 개체에 대해 다음
는foreach (Player p in fm.Players)
{
int ca = (short)ProcessManager.ReadFromBuffer(p.OriginalBytes, PlayerOffsets.Ca, typeof(Int16));
}
그것은 단지 63 밀리합니다. (ReadFromBuffer는 byte[], int, Type
을 가져와 object
을 반환하는 매우 최적화 된 함수입니다.) 많은 양의 객체를 고려할 때 63ms가 매우 적당합니다.
하지만! PostSharp에서, 나는이를 사용하여 완전히 동일 구현 :
public override void OnInvocation(MethodInvocationEventArgs eventArgs)
{
if (eventArgs.Method.Name.StartsWith("~get_"))
{
if (Global.DatabaseMode == DatabaseModeEnum.Cached)
{
byte[] buffer = ((BaseObject)eventArgs.Instance).OriginalBytes;
eventArgs.ReturnValue =
ProcessManager.ReadFromBuffer(buffer, this.Offset, eventArgs.Method.ReturnType);
}
지금 나는이
foreach (Player p in fm.Players)
{
int ca = p.CA;
}
를 사용하여 그리고 그것은 많은
782 MS, 10 회 이상 소요 전화!
나는 같은 화면 생성 :
[Serializable]
[MulticastAttributeUsage(MulticastTargets.Method, PersistMetaData = true)]
internal class FMEntityAttribute : OnMethodInvocationAspect
{
public FMEntityAttribute(int offset, int additionalStringOffset)
{
this.Offset = offset;
this.AdditionalStringOffset = additionalStringOffset;
}
//blah blah AOP code
}
을 그리고 재산 내가이 잘 수행하기 위해 얻을 수있는 방법
[FMEntityAttribute(PlayerOffsets.Ca)]
public Int16 CA { get; set; }
처럼 장식되어 있습니다!
프로파일 링 작업에서 비싼 핫스팟이 무엇을 나타 냈습니까? –
대부분의 시간이 내 재산 취득에 사용되었지만 실제로 유용한 정보는 아닙니다. –