慢速WCF:500ms用于“void Test()”

时间:2013-06-20 18:11:06

标签: c# wcf nettcpbinding

我有一个由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毫秒}}。我希望我的功能总是非常快,包括第一次通话。我怎么能这样做?

1 个答案:

答案 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()然后运行此基准测试。

请发布您的结果,我很想知道它是怎么回事。