Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#WCF客户端-服务器消息传递/事务优化_C#_Wcf_Networking - Fatal编程技术网

c#WCF客户端-服务器消息传递/事务优化

c#WCF客户端-服务器消息传递/事务优化,c#,wcf,networking,C#,Wcf,Networking,我有一个客户机-服务器应用程序,我正在尝试优化。 我构建了一个psydo客户端来与我的服务器的api相抗衡。 我在一个盒子上运行客户机,在另一个盒子上运行服务器。 我试图将两个事件之间的某些事件的时间关联起来,其中时间是根据每个本地系统的本地系统时钟记录的。 客户端发送请求并记录该时间。 服务器接收该请求并记录该时间。 服务器在处理表单/发送响应时执行此操作,并记录该时间。 客户端记录完成接收响应的时间 最终,我要做的是通过客户机发送的请求和收到的响应来衡量put的改进 我试图有意义地关联两个系

我有一个客户机-服务器应用程序,我正在尝试优化。 我构建了一个psydo客户端来与我的服务器的api相抗衡。 我在一个盒子上运行客户机,在另一个盒子上运行服务器。 我试图将两个事件之间的某些事件的时间关联起来,其中时间是根据每个本地系统的本地系统时钟记录的。 客户端发送请求并记录该时间。 服务器接收该请求并记录该时间。 服务器在处理表单/发送响应时执行此操作,并记录该时间。 客户端记录完成接收响应的时间

最终,我要做的是通过客户机发送的请求和收到的响应来衡量put的改进

我试图有意义地关联两个系统上的时钟,是否遗漏了什么?这可能吗?如果是的话,是如何做到的?您如何衡量/改进这一成果?

目前,我的客户告诉我,对于19000多个事务,每秒(或平均间隔0.04秒)发送25个请求以响应接收。 但是服务器上的两个时间戳告诉我我正在处理一个事务,收到的请求到响应平均在0.020秒内回复(按比例增加的容量~最大:50个事务/秒) 这意味着1/2的开始到结束时间是数据“在线”(归功于文斯·沃恩)。 如果我必须将在线时间视为固定时间,并且只能优化服务器周转时间(这意味着),并且假设我可以将其减少到0,那么我的最大吞吐量不能超过每秒50个事务。 我认为这可以减少到这个的百分之一。对于1G网络来说,只有50个事务/秒的速度似乎太慢了,因为一个数据包只需经过一个交换机和大约50'长的电缆

那么,如何将这两个系统时间关联起来呢?
你是如何衡量这一点的?

这是一个很酷的测试-你的技术听起来是一个很好的解决方案

您是否将日期和时间答案保存在某个地方?是否时间差(分别为0.04和0.02秒)是由于记录这些日期所需的时间?i、 例如,如果您保存到数据库,并且可能需要一些时间才能完成插入/更新,因为有索引的大表等原因

编辑 我在下面尝试使用在同一台机器上运行的WCF服务器和客户机进行模拟,以消除WCF本身可能因任何原因而变慢的情况。情况似乎并非如此,因此我只能建议尝试找出事件日志记录是否可能导致延迟,或者您的网络设置是否确实存在一些奇怪的延迟

我的服务器代码:

public interface IServiceWCF
{
    [OperationContract]
    DateTime TestConnectionSpeed(DateTime messageSentFromClientTime, out DateTime messageReceivedAtServerTime, out int millisecondsBetweenClientSentAndServerReceived);
}

public class ServiceWCF : IServiceWCF
{
    public DateTime TestConnectionSpeed(DateTime messageSentFromClientTime, out DateTime messageReceivedAtServerTime, out int millisecondsBetweenClientSentAndServerReceived)
    {
        messageReceivedAtServerTime = DateTime.Now;
        TimeSpan span = messageReceivedAtServerTime - messageSentFromClientTime;
        millisecondsBetweenClientSentAndServerReceived = (int)span.TotalMilliseconds;
        return DateTime.Now;
    }
}   
我的客户代码

int millisecondsBetweenClientSentAndServerReceived;
DateTime clientSent = DateTime.Now;
DateTime serverReceived;
DateTime serverSent = wcfService.TestConnectionSpeed(clientSent, out serverReceived, out millisecondsBetweenClientSentAndServerReceived);
DateTime responseReceived = DateTime.Now;
TimeSpan span = responseReceived - serverSent;  
int millisecondsBetweenServerSentAndClientReceived = (int)span.TotalMilliseconds;

Console.WriteLine("Message sent from client at {0} - server received {1} milliseconds later at {2} - server response sent at {3} - was received at client {4} milliseconds later at {5}",
    clientSent,
    millisecondsBetweenClientSentAndServerReceived,
    serverReceived,
    serverSent,
    millisecondsBetweenServerSentAndClientReceived,
    responseReceived);
而答案大部分是非常快的-1毫秒-参见示例输出:

Message sent from client at 3/24/2017 3:56:22 PM - server received 1 milliseconds later at 3/24/2017 3:56:22 PM - server response sent at 3/24/2017 3:56:22 PM - was received at client 1 milliseconds later at 3/24/2017 3:56:22 PM

这是一个很酷的测试——你的技术听起来是一个很好的解决方案

您是否将日期和时间答案保存在某个地方?是否时间差(分别为0.04和0.02秒)是由于记录这些日期所需的时间?i、 例如,如果您保存到数据库,并且可能需要一些时间才能完成插入/更新,因为有索引的大表等原因

编辑 我在下面尝试使用在同一台机器上运行的WCF服务器和客户机进行模拟,以消除WCF本身可能因任何原因而变慢的情况。情况似乎并非如此,因此我只能建议尝试找出事件日志记录是否可能导致延迟,或者您的网络设置是否确实存在一些奇怪的延迟

我的服务器代码:

public interface IServiceWCF
{
    [OperationContract]
    DateTime TestConnectionSpeed(DateTime messageSentFromClientTime, out DateTime messageReceivedAtServerTime, out int millisecondsBetweenClientSentAndServerReceived);
}

public class ServiceWCF : IServiceWCF
{
    public DateTime TestConnectionSpeed(DateTime messageSentFromClientTime, out DateTime messageReceivedAtServerTime, out int millisecondsBetweenClientSentAndServerReceived)
    {
        messageReceivedAtServerTime = DateTime.Now;
        TimeSpan span = messageReceivedAtServerTime - messageSentFromClientTime;
        millisecondsBetweenClientSentAndServerReceived = (int)span.TotalMilliseconds;
        return DateTime.Now;
    }
}   
我的客户代码

int millisecondsBetweenClientSentAndServerReceived;
DateTime clientSent = DateTime.Now;
DateTime serverReceived;
DateTime serverSent = wcfService.TestConnectionSpeed(clientSent, out serverReceived, out millisecondsBetweenClientSentAndServerReceived);
DateTime responseReceived = DateTime.Now;
TimeSpan span = responseReceived - serverSent;  
int millisecondsBetweenServerSentAndClientReceived = (int)span.TotalMilliseconds;

Console.WriteLine("Message sent from client at {0} - server received {1} milliseconds later at {2} - server response sent at {3} - was received at client {4} milliseconds later at {5}",
    clientSent,
    millisecondsBetweenClientSentAndServerReceived,
    serverReceived,
    serverSent,
    millisecondsBetweenServerSentAndClientReceived,
    responseReceived);
而答案大部分是非常快的-1毫秒-参见示例输出:

Message sent from client at 3/24/2017 3:56:22 PM - server received 1 milliseconds later at 3/24/2017 3:56:22 PM - server response sent at 3/24/2017 3:56:22 PM - was received at client 1 milliseconds later at 3/24/2017 3:56:22 PM

我去过那里,我就是这么做的

让客户端记录发送请求的时间并将其发送到服务器。 当服务器收到时,让服务器计算客户端报告的
时间跨度
,并对照服务器自己的
日期时间。现在

让服务器记录它相对于
时间跨度
日期时间的时间。现在。
减去
(tsVariable)
您可以(稍微*)将服务器视为根据“客户端”时钟记录时间

您需要减去差值,因为如果服务器的时钟比客户端的时钟早一点,则减去差值,使服务器的
日期时间。现在
更接近地反映客户端的相对
日期时间。现在
。在这种情况下,时间跨度将为(+)正值。如果服务器的时钟稍微落后于客户端的时钟,则TimeSpan将为(-)负。但是仍然要减去
时间跨度
。这将是所谓的“减去负数”,这与添加
TimeSpan
以捕获服务器的
DateTime.Now
到相对客户端的
DateTime.Now
相同

当响应返回到客户机时,让客户机再次记录自己的时钟,以记录收到的最终响应。服务器不需要向客户端报告其时间

*不利的一面是从客户端首次开发要向服务器报告的内容到服务器收到该报告然后计算
TimeSpan
的时间间隔之间的时间间隔,双方都不知道。但我不得不相信,这不会产生太大的后果,或者至少从务实的角度来说不会

我玩的另一个场景是让客户机首先获得服务器的时间。这应该是尽可能多的提取。 让客户端计算
时间跨度
,将其用于记录和向服务器报告。。。。你可能会发现这种程度的努力并没有带来很多好处

一个高端选项是第三个系统