2009-08-26 27 views
2

我有两个使用Winsock编写的使用C++编写的程序。它们都接受TCP连接,一个接收数据发送数据。它们是在Visual Studio 2008中编译的。我还有一个用C#编写的程序,它连接到两个C++程序,并将它从一个接收的数据包转发并发送给另一个。在此过程中,它计数并显示转发的数据包数量。此外,显示从第一个包到最近一个包的经过时间。程序在我的机器上运行2秒,但在其他程序上运行15秒

发送数据包的C++程序只循环1000次发送完全相同的数据。当我在我的开发机器上运行所有三个应用程序(使用环回或实际IP)时,数据包将在大约2秒内通过整个系统运行。当我在我们实验室的任何其他PC上运行这三个软件时,总是需要15到16秒。每台PC都有不同的处理器和大量内存,但它们都运行Windows XP Professional。我的开发PC实际上有一个较老的AMD Athlon,它的内存只有一台机器需要更长的时间才能完成这项任务。我已经在我的机器上的任务管理器中观看了CPU时间图,而另一个人则在这些程序运行时都没有使用大量的处理器(即超过10%)。

有没有人有任何想法?我只能想到在目标机器上安装Visual Studio,看看它是否与此有关。

问题解决============================================ ========

我首先安装了Visual Studio,看看是否有任何效果,它没有。然后我测试了我的新开发PC上的程序,它的运行速度与我之前的一样快。在Vista笔记本电脑上运行这些程序的时间再次缩短了15秒。

我在服务器程序的某些指令的任一侧打印了时间戳,以查看哪些时间最长,并且我发现延迟是由1毫秒的Sleep()方法调用引起的。显然在我的新旧系统上,Sleep(1)被忽略,因为我会在同一毫秒内发送10到20个数据包。有时候我会在执行时间中断约15或16毫秒,导致1000个数据包的时间大约为2秒。在花费大约15秒来运行1000个数据包的系统上,我会在发送每个数据包之间有15或16毫秒的间隔。

我注释了Sleep()方法调用,现在数据包立即发送。谢谢您的帮助。

+0

睡眠()只有在您要求时才能保证睡眠。它可能会睡得更久。我相信在Windows中,您可以调用一个函数来要求严格的多媒体时序,这会改变这种行为。 – 2013-10-10 18:21:44

+0

http://msdn.microsoft.com/en-us/library/windows/desktop/dd743626%28v=vs.85%29.aspx – 2013-10-10 18:22:49

回答

3

您应该在良好,2秒钟的情况和15秒的实验室情况下对您的应用程序进行简介,并查看它们的不同之处。这种差异可能是由于任何问题(磁盘,防病毒,网络) - 没有任何数据支持它,我们只是在黑暗中拍摄。

如果您无法访问分析器,则可以将计时工具添加到程序的各个阶段,以查看哪个阶段需要更长的时间。

相关问题