2

我有两个使用 Winsock 的 C++ 程序。它们都接受 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 上测试了这些程序,它的运行速度和我的旧 PC 一样快。在 Vista 笔记本电脑上运行程序再次产生了 15 秒的时间。

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

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

4

2 回答 2

3

您应该在良好的 2 秒案例和 15 秒实验室案例上分析您的应用程序,并查看它们的不同之处。差异可能是由于任何数量的问题(磁盘、防病毒、网络)造成的——如果没有任何数据支持,我们只会在黑暗中拍摄。

如果您无权访问分析器,则可以将计时检测添加到程序的各个阶段,以查看哪个阶段花费的时间更长。

于 2009-08-26T20:26:21.143 回答
0

您可以尝试检查Winsock 性能调整注册表设置- 可能是某些游戏或实用程序的安装在您的 PC 上调整了这些设置。

于 2009-08-26T20:29:52.243 回答