我有两个用C ++编写的程序,它们使用Winsock。它们都接受TCP连接,一个发送数据,另一个接收数据。它们是在Visual Studio 2008中编译的。我还有一个用C#编写的程序,它连接到两个C ++程序并转发它从一个接收的数据包并将它们发送到另一个。在此过程中,它会计算并显示转发的数据包数。此外,还会显示从第一个数据包到最新数据包的经过时间。
发送数据包的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 :(得分:3)
您应该根据良好的2秒案例和15秒的实验案例分析您的申请,并查看它们的不同之处。差异可能是由于任何数量的问题(磁盘,防病毒,网络) - 没有任何数据支持它我们只是在黑暗中拍摄。
如果您无权访问探查器,可以在计划的各个阶段添加计时检测,以查看哪个阶段需要更长的时间。
答案 1 :(得分:0)
您可以尝试检查Winsock performance tuning registry settings - 可能是某些游戏或实用程序的安装调整了您的PC上的内容。