gpt4 book ai didi

java - 如何在 C++ 中有效地管理内存/时间?

转载 作者:搜寻专家 更新时间:2023-10-31 01:06:27 25 4
gpt4 key购买 nike

案例:

我用 Java 编写了一个 minimax 算法,然后我将代码移植到 C++ 中,并保留相同的类和方法。然后,我通过将 delete 函数放入析构函数(如果可能)来验证 C++ 代码,直到所有内存泄漏都得到修复。当所有漏洞都得到修复后,我在井字游戏上测试了该算法,然后将其代码以相同的方式移植到 C++ 中。我确信 C++ 版本的性能会更高,但令我惊讶的是,C++ 版本在 125 秒内解决了 100 个(不是随机的)游戏实例,而 Java 版本在 30 秒内解决了它们!然后,我使用系统监视器检查了两个程序的内存使用情况:测试结束时 Java 代码的内存使用量增加了大约 20%,而 C++ 版本的内存使用量仅增加了 5%。

然后,在我看来,很明显这个delete 策略可以节省内存但会降低性能,这不是我想要的,至少在这种情况下是这样。是否有另一种删除策略来更好地设计需要小运行时但允许高内存使用的软件?

最佳答案

malloc 和 delete 必须做更多的工作

  • 内存不是以多线程方式分配的
  • 内存不是在内存中连续分配的,而是为空闲内存区域分配的。
  • delete 在当前线程中执行。
  • 对于 64 位应用程序,您可能会发现内存对齐是 16 字节而不是 8 字节,从而导致每次分配的填充更多。

C++ 中可能的解决方案

  • 不要过多使用堆,在堆栈上分配比 Java 或 C++ 的堆快得多,而且是多线程的。
  • 如果可能,立即分配对象 block ,例如对象数组是 C++ 中的一次分配,而不是 Java 中的 N+1。
  • 使用多线程分配器。 C++ 支持多个分配器。
  • 使用竞技场分配模式。如果你有一个包含很多节点的大型数据结构,你可以一次分配 N 个节点的 block ,当你释放这些节点时,构建一个空闲节点的链表。您需要对节点本身执行此操作。在这种方法中,整个数据结构/区域被立即释放。

简而言之,如果您将 Java 代码直译为 C++,它可能会更慢,因为这没有利用 C++ 允许但 Java 不允许的所有优化。

顺便说一句,Java 6+ 使用 32 位引用最多 32 GB 的内存。如果您构建 64 位 C++ 应用程序,请查看使用 32 位指针/引用/索引是否适合您。

关于java - 如何在 C++ 中有效地管理内存/时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20759529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com