2011-12-26 3 views
2

기본 WCF 직렬 기인 DataContractSerializer로 작업하는 .Net 3.5 SP1을 사용하고 있습니다. 나는이 간단한 인터페이스를 가지고 :첫 번째 호출에서 WCF 직렬화가 느립니다.

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    void RecieveInteger(int value); 

    [OperationContract] 
    void RecieveBigDataType(BigDataType value); 
} 

내 클라이언트는 다음을 수행

  1. 를 불러옵니다 'RecieveInteger는 그냥 워밍업하는 서비스를.
  2. 'RecieveBigDataType'을 10 회 호출하고 성능을 측정합니다.

'RecieveBigDataType'에 대한 10 번의 호출을 측정 한 결과 첫 번째 호출이 다른 호출보다 훨씬 느린 것을 발견했습니다. WCF가 'BigDataType'유형을 직렬화해야 할 필요가있는 것처럼 보입니다. 매우 느리게 진행됩니다. 첫 번째 전화를 더 빠르게 할 수있는 아이디어가 있습니까? MSDN에 따르면

+0

어떻게 테스트? . .means ServiceClient 개체를 한 번 생성하고이를 10 번 또는 새 서비스 클라이언트 및 호출 메서드를 만들 때마다 호출합니다. – dotnetstep

+0

하나의 ServiceClient 객체 만 생성 한 다음 위에서 작성한 액션 1-2를 수행합니다. – Sean

+0

1. 처음 객체를 만들 때 2. 그런 다음 웹 서비스를 처음 호출하면 해당 시간에 통신 채널을 생성합니다. 그래서 다음 번에 hapeend를 호출하면 연속적으로 해당 채널이 사용되므로 하위 연속 호출이 더 빠릅니다. 매번 ServiceClient를 만들고 성능 차이를 측정하십시오. – dotnetstep

답변

1

, XmlSerializer를 들어 XmlSerializer를 초기화

시작

XmlSerializer가이 타입을 발견 처음에 FromTypes를 호출함으로써, 순차 나열을 수행하는 코드를 생성하고이를 해당 코드를 캐싱 나중에 사용하기 위해. 그러나 XmlSerializer의 FromTypes 정적 메서드를 호출하면 XmlSerializer가 직렬화하려는 형식의 필수 코드를 즉시 생성하고 캐시합니다. 이렇게하면 특정 유형을 처음으로 직렬화하는 데 걸리는 시간이 줄어 듭니다. 다음 예는이 접근법을 보여줍니다.

static void OnApplicationStart() 
{ 
    Type[] myTypes = new Type[] { Type.GetType("customer"), Type.GetType("order") }; 
    XmlSerializer.FromTypes(myTypes); 
} 

난 당신이 같은 일을 어쩌면 몇 가지 방법이 DataContractSerializer를 사용하는 WCF를 사용되지만 알고있다. 여기에서

: 클라이언트에서 http://msdn.microsoft.com/en-us/library/ff650685.aspx

+0

나는 그것을 시도했다 (또한 serializer를 xmlSerializer로 변경하여 테스트했다.), 불행히도 개선이 없다. – Sean

+0

아마도 귀하의 스핀 업 시간은 서비스 당 운영 기준이 될 것입니다. –

+0

확실히 직렬화 문제입니다. 같은 매개 변수를 사용하여 나중에 다른 서비스 작업을 호출하면 속도가 빨라집니다. 도와 줘서 고마워. – Sean

관련 문제