【问题标题】:Dynamic memory allocation in game server [closed]游戏服务器中的动态内存分配[关闭]
【发布时间】:2014-01-14 08:46:00
【问题描述】:

我目前正在编写 MMO 服务器。 而且我现在为传入的数据包分配了动态内存(首先读取 8 字节标头,然后为正文分配内存并在数据包 API 类中读取正文)。 但是我听说动态内存分配很慢。 现在,我应该继续使用动态内存分配(我使用 boost asio 异步执行读/写操作)还是应该将其转换为固定大小? 我的模型中使用的最大数据包大小是 5824 字节,我不认为使用具有该值的静态缓冲区会很好。 谢谢。

【问题讨论】:

  • 从堆中分配每个数据包会很慢。从内存中分配一个大块,然后在每个数据包中分发它的碎片会更快。
  • 5824 对于堆栈分配的数组应该没问题。此外,您已标记此c++,您可能应该使用std::vectorstd::array 和朋友。
  • 您的计算机和互联网连接哪个更快?我建议先对其进行分析,然后应用任何必要的更改来提高性能。
  • 我建议你自学如何测试它慢的理论,并验证它是否慢。也就是说,SmartHeapJEMallocGoogle-Perftools 这样的分配器存在是有原因的。
  • 许多高性能、多线程、面向网络的服务器出于可移植性考虑而避免使用系统分配器。并非所有系统分配器都是平等的,有些只是在繁忙的多线程环境中表现不佳,主要是因为它们的资源位于简单的互斥锁/解锁之后。当然,同样大部分的问题通常是,我写得不好的代码,分配和释放就像没有明天将所有争用放在分配器上一样。

标签: c++ memory memory-management boost-asio


【解决方案1】:

在现实世界中,动态分配比自动分配慢。这是真的——至少在一般情况下是这样。

这并不意味着动态分配太慢。确定这一点的唯一方法是分析您的代码。在你完成之前,不可能说你应该放弃动态分配,因为它太慢了。

这并不是说您选择使用动态分配是正确的选择。 .除了性能之外,动态分配通常是最好不提供服务的原因。在确定您的设计之前,您应该了解内存分配的性质、以特定方式分配内存的原因以及每种方式的优缺点。

在 C++ 中,默认分配方法通常应该是自动分配,直到您有理由使用其他方法。

您的问题中有很多“我听说过”和“我不这么认为”。软件工程不是猜测和谣言。这是关于严谨和逻辑的。测试你的代码。识别瓶颈。修复您知道的问题。

【讨论】:

    猜你喜欢
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2014-03-18
    • 2017-02-03
    • 2012-09-08
    • 2016-08-09
    相关资源
    最近更新 更多