我有一个从Windows移植到Linux的应用程序。现在相同的代码在VS C ++和g ++上编译,但是当它在Win上运行以及在Linux上运行时,性能会有所不同。此应用程序的范围是缓存。它是服务器和客户端之间的节点,它在列表中缓存客户端请求和服务器响应,以便任何其他客户端发出已经由服务器处理的请求,此节点将响应而不是将其转发到服务器。 / p>
当此节点在Windows上运行时,客户端将在大约7秒内获得所需的全部内容。但是当同一节点在Linux(Ubuntu 9.04)上运行时,客户端会在35秒内启动。每个测试都是从头开始。我试图理解为什么这个时间差异。一个奇怪的场景是节点在Linux上运行但在由Win托管的虚拟机中运行。在这种情况下,加载时间大约为7秒,就像它本身运行Win一样。所以,我的印象是网络存在问题。
此节点使用UDP协议发送和接收网络数据,并使用boost :: asio作为实现。我试图更改所有支持的套接字标志,更改缓冲区大小,但没有。
有人知道为什么会发生这种情况,或者与UDP相关的任何可能影响性能的网络设置?
感谢。
答案 0 :(得分:1)
如果您怀疑网络问题需要网络捕获(Wireshark非常适合此类问题)并查看流量。
根据网络捕获或基于探查器的输出,找出花费的时间。 一旦你知道你已经解决了一半。
答案 1 :(得分:0)
这些时间差异可能取决于许多因素,但首先想到的是您使用的是现代Windows版本。 XP已经具有将最近使用的应用程序保留在内存中的功能,但在Vista中,这更好地进行了优化。对于您加载的每个应用程序,将创建一个特殊的加载文件,该文件与它在内存中的外观相同。下次加载应用程序时,应该会更快。
我不了解Linux,但很有可能每次都需要完全加载你的应用程序。如果比较运行时的性能,可以更好地测试两个系统之间的性能差异。保持应用程序打开(如果可以使用您的设计)并再次进行比较。
系统优化内存的这些差异由您的方案使用VM方法进行备份。
基本上,如果排除其他正在运行的应用程序并且以高优先级模式运行应用程序,性能应该接近相等,但这取决于您是否使用特定于操作系统的代码,如何访问文件系统,你如何使用UDP协议等等。