Tôi đang cố gắng tìm ra lý do tại sao cuộc gọi WCF đầu tiên sau khi ứng dụng máy khách bắt đầu mất nhiều thời gian hơn so với lần thứ hai.Tại sao cuộc gọi khách hàng WCF đầu tiên lại chậm?
Tôi đã làm gì để kiểm tra rằng:
- thực hiện đơn giản tự tổ chức WCF Server và giao diện điều khiển của khách hàng.
- Máy chủ được làm nóng lên - Tôi chạy nó và gọi phương thức nhiều lần trước khi chạy thử nghiệm.
- Ràng buộc là
basicHttpBinding
để giảm chi phí bảo mật và mạng. - Kịch bản thử nghiệm - bắt đầu ứng dụng khách trên bàn điều khiển, thực hiện hai cuộc gọi dịch vụ WCF giống nhau liên tiếp.
Trong thử nghiệm của mình, tôi thấy ~ 700 mili giây cho cuộc gọi đầu tiên và ~ 3 mili giây cho cuộc gọi thứ hai.
Gần như một giây dường như là quá nhiều thời gian cho trình biên dịch JIT. Tôi sẽ chấp nhận nếu thời gian đó được sử dụng để khởi tạo một số cơ sở hạ tầng phức tạp như ObjectContext
trong khung Entity nhưng mã của tôi rất đơn giản và các lớp proxy đã được biên dịch.
Tôi cũng đã thử ràng buộc netNamedPipeBinding
. Kết quả chứng minh mẫu - cuộc gọi đầu tiên mất ~ 800 ms, cuộc gọi thứ hai mất ~ 8 ms.
Sẽ đánh giá cao nếu có ai có thể giải thích tại sao cuộc gọi dịch vụ đầu tiên mất quá nhiều thời gian.
Đã thử nghiệm trong Win 7 64 bit.
Triển khai của tôi ở bên dưới.
hợp đồng:
[ServiceContract]
public interface ICounter
{
[OperationContract]
int Add(int num);
}
Dịch vụ thực hiện:
public class CounterService: ICounter
{
private int _value = 0;
public int Add(int num)
{
_value += num;
Console.WriteLine("Method Add called with argument {0}. Method returned {1}", num, _value);
return _value;
}
}
Server thực hiện:
class Program
{
static void Main(string[] args)
{
Uri baseAddress = new Uri("http://localhost:8080/Service");
// Create the ServiceHost.
using (ServiceHost host = new ServiceHost(typeof(CounterService), baseAddress))
{
host.Open();
Console.WriteLine("The service is ready at {0}", baseAddress);
Console.WriteLine("Press <Enter> to stop the service.");
Console.ReadLine();
// Close the ServiceHost.
host.Close();
}
}
}
Server Configuration:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="Server.CounterService">
<endpoint address="base" binding="basicHttpBinding" name="baseDefault"
contract="Contract.ICounter" />
<endpoint address="net.pipe://localhost/Service/netNamedPipe"
binding="netNamedPipeBinding" name="netNamedPipeDefault" contract="Contract.ICounter" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
thực hiện Khách hàng (CounterProxy
được tạo ra từ dịch vụ tham khảo):
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
using (var proxy = new CounterProxy.CounterClient(_endpointConfigurationName))
{
output = proxy.Add(1);
}
stopWatch.Stop();
// Get the elapsed time as a TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;
Chức năng này sẽ chứa mã gọi là hai lần liên tiếp.
Client Configuration:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<client>
<endpoint address="http://localhost:8080/Service/base" binding="basicHttpBinding"
contract="CounterProxy.ICounter"
name="baseDefault" />
</client>
</system.serviceModel>
</configuration>
lẽ tải/biên soạn đối tượng proxy lần đầu tiên xung quanh, các serialisers XML vv Nếu bạn xem cửa sổ đầu ra, bạn sẽ thấy một cái gì đó như "Loaded assembly x54fjfj3fj" mà là một khách hàng WCF biên soạn. –
Tôi đổ lỗi cho kiểm tra an ninh và 100 bí ẩn khác. Có nhiều cách hơn nhị phân liên quan đến những gì đang được triển khai trong dịch vụ. Để gỡ lỗi dịch vụ sử dụng các bộ theo dõi trong cấu hình và truy cập nhật ký, chúng sẽ hiển thị các bước theo mili giây thời gian chính xác được sử dụng. Bạn sẽ thấy một cái gì đó như xác thực, bộ lọc, vv ngay cả khi bạn có tất cả mọi thứ hoạt động như ẩn danh. –