我有一个由Windows服务托管的WCF服务。它工作但调用它非常慢:像void Test()
这样的简单函数从客户端调用到服务器接收大约需要500毫秒。
我尝试了几种不同的配置,但没有成功地加快速度。客户端和服务器都在同一台机器上。
以下是代码:
Shared.dll
:
[ServiceContract]
public interface IContract
{
[OperationContract]
void Test();
}
Server.exe
:
public class Service : IContract
{
public void Test()
{
this.Log("Test: " + DateTime.Now.TimeOfDay);
}
}
Client.exe
:
var binding = ...;
var factory = new ChannelFactory<IContract>(binding, "net.tcp://localhost/Service");
var service = factory.CreateChannel();
this.Log("Test: " + DateTime.Now.TimeOfDay);
service.Test();
app.config
:
<system.serviceModel>
<services>
<service behaviorConfiguration="ServiceBehavior" name="Server.Service">
<endpoint address="Service" binding="netTcpBinding" bindingConfiguration="NetTcp" contract="Shared.IContract">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost/" />
</baseAddresses>
</host>
</service>
</services>
<bindings>
<netTcpBinding>
<binding name="NetTcp" portSharingEnabled="true">
<security mode="None">
<message clientCredentialType="None"/>
<transport protectionLevel="None" clientCredentialType="None"/>
</security>
<reliableSession enabled="false" />
</binding>
</netTcpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
我目前正在使用同一台机器中的客户端和服务器对此进行测试,但我们的想法是将它们放在不同的机器上进行生产。
工厂和渠道创作不是这里的罪魁祸首。我裁定在创建和日志之间加一个Thread.Sleep(20000)
并获得相同的结果。
第一次调用时客户端日志和服务器日志之间的差异大约为500毫秒(实际上,它在300毫秒到1秒之间的任何时间)但是,对于{{1>的任何更多调用,它持续时间不到5毫秒}}。我希望我的功能总是非常快,包括第一次通话。我怎么能这样做?
答案 0 :(得分:-1)
假设您使用Datetime.Now来衡量这一点,我会建议采用不同的方法进行基准测试。
var elapsedTimes = new List<long>();
var stopwatch = new Stopwatch();
for (var i = 0; i < 1000; i++)
{
stopwatch.Reset();
stopwatch.Start();
service.Test();
stopwatch.Stop();
elapsedTimes.Add(stopwatch.ElapsedMilliseconds);
}
Log("Average time for Test(): " + elapsedTimes.Average() + "ms");
此外,第一次调用似乎总是很慢,可能是因为在服务端进行了初始化。尝试一次调用service.Test()然后运行此基准测试。
请发布您的结果,我很想知道它是怎么回事。