对于需要大量RAM的应用程序选择C ++还是Java?[关闭]


11

我正在考虑的科学应用程序大多受处理器限制,并且堆使用量很大(至少几个GB)。在一年中的任何其他时间,我都会很高兴地使用C ++,但是在这种情况下,我想知道,与Java压缩收集器的优势相比,C ++内存管理器的自然碎片是否会成为一个严重的问题。

有人可以指出与此相关的真实示例吗?


在这种情况下,我认为语言不如编程重要。任何成熟的语言都可能有效,具体取决于您的计算规模。有Java,C / C ++,甚至Python和红宝石都可以扮演这个角色。有些听起来可能比其他的要难,因为听起来您确实需要确定自己没有泄漏内存。
钻机2012年

2
如果您能以$ 7.99的价格获得GB,那是一个问题吗?金士顿1GB DDR3
Bo Persson

2
@BoPersson,以我的经验,遇到此类问题的人首先是完全装满了高端主板,然后抱怨说他们放不下自己想要的东西,然后输入尽可能多的可管理数据集,然后抱怨说这还不够。
AProgrammer 2012年

@dsign,在这些日子里,您可以让主板以不到1000欧元的价格接受几百个演出,而几个演出并不占用大量内存。
AProgrammer 2012年

1
同意廉价内存部分。在开发方面,我已经使用C ++了一段时间,良好的编码实践使泄漏很少出现。实际上,在这方面,我真的更喜欢C ++而不是Java。
dsign 2012年

Answers:


11

如果你正在谈论这势必会应用强调的机器的限制,例如,你希望你会做的编程技巧,以避免超过这些限制,那么C ++是要走的路。C ++不仅为您提供了Java所没有的优化空间(正如Emilio所指出的那样),而且垃圾回收器是非常消耗内存的设备,它们需要大量额外的空闲内存才能有效地工作。

这个问题的答案:StackOverflow:垃圾回收需要多少额外的内存?画一个相当严峻的画面,但即使垃圾收集需要的空闲内存只有约尽可能多的已分配的内存,(这是我听说过的,)这还意味着,Java中,你仍然需要大量的空闲内存使其有效运行。

另一方面,如今,我们通常更喜欢购买更昂贵的硬件,而不是必须执行编程技巧来避免超出硬件限制。在您的情况下,通常可以通过使用64位计算机并在必要时在其上抛出尽可能多的RAM模块来解决RAM问题。您会看到,当今的发达国家,硬件成本远不及开发时间。

我认为您应该认真考虑这个选项,并且如果可能的话,请选择该选项,并使用Java而不是C ++,因为用Java开发某些东西比使用C ++并在以后进行维护要容易得多。


感谢您的回答。我同意您的硬件插图。
dsign 2012年

如果您不关心垃圾回收运行时程序的暂停,则内存需求会小得多。

1
我不同意最后一段。Java不一定比C ++更容易开发。这对我来说不是,因为在过去的五六年中,我已经做了大量的C ++和相对较少的Java。可以用C ++和Java编写可维护和不可维护的代码。
David Thornley,2012年

1
@DavidThornley我从事C / C ++工作已有10年以上,而使用Java已有6年以上。我发现Java在所有方面都更加容易:原型开发,开发,扩展和维护。但是无论如何,这就是意见的本意:差异。C-:=
Mike Nakis 2012年

你们有没有为大数据,需要处理器的项目编程的?有什么意见吗?
dsign 2012年

7

问题不在于使用C ++,因为它是Java,而不是使用Java,因为它是C ++。就像Java免费存储一样,通常实现C ++容器来避免过多的碎片。

但是,如果您直接分配内存,那么您也可以执行Java不允许您执行的操作,这可能会导致碎片化。

正确的解决方案(在C ++中)是通过分配器类使用容器和智能指针,该分配器类通过固定的“ plex”来管理分配(此处的关键是编写一个好的分配器类)。这是一种与Java无关的编程风格,因此任何比较都是没有意义的。

[编辑]这可能是过时的示例: 固定分配


感谢您的回答Emilio。我非常了解C ++的灵活性,并倾向于同意您的看法。再说一遍,我想知道一些实际使用的例子,这些技巧已经成功使用。
dsign 2012年

@dsign:帖子已编辑,请参见链接
Emilio Garavaglia'1

1
我以前使用过这些技术。效果不佳的应用将其分配器更改为使用一组固定块堆。因此,当您需要4字节块时,它来自仅存储4字节块的堆。如果您需要5个字节,则它来自8个字节的块堆,等等。性能提升(对于我们大量分配的应用程序)是巨大的。您可能不会得到很好的结果,但是它可能非常有效。由于所有分配都位于固定块中,因此零碎片也存在。
gbjbaanb 2012年

2

垃圾收集的优点是它模拟了具有无限内存量的计算机。这种抽象的机制或实现旨在使您作为程序员完全透明。我们都知道,该机制正在回收程序不再使用的内存,但是实际上并不能保证。如果您在具有比程序实际使用的内存更多的RAM的计算机上运行该程序,则可能永远不会进行垃圾回收。同样,这无关紧要,因为您可以只编写程序而不必考虑程序如何使用内存。每当程序请求内存管理器时,它只会分配更多的RAM,并且您可以假定此类分配将始终成功。Java是一种垃圾收集语言,而C ++不是。1个

垃圾收集的缺点是,像所有抽象一样,垃圾收集容易泄漏。它并非始终都能始终正常运行,特别是在某些情况下,并且您很可能会遇到错误。编写垃圾收集算法(对于程序员来说应该透明的一种)的人员针对最常见的情况进行了优化,而常见情况的麻烦在于它们从来都不是那么普遍。通常,在管理内存方面,您做得比垃圾收集器还好。但是在特定情况下(并且有足够的时间,精力和理解力),这是可能的。C ++给您这种灵活性。Java没有。

综上所述,我认为选择语言的标准建议适用于此,在这种情况下,考虑到限制因素,甚至可能更适用。选择该项目的主要开发人员最熟悉的语言。除了显而易见的原因(例如您将能够更快,更高效地开发应用程序)之外,这尤其重要在您描述的情况下非常重要,因为像在编程Java一样对C ++进行编程将导致极其无效的内存管理实践,从而导致泄漏和崩溃。类似地,用Java编程就像用C ++编程一样,并不能为您带来很多好处,并且可能会针对最常见的情况对垃圾收集算法进行调整和优化,从而最终生成的程序未达到优化要求。 。

习惯于使用垃圾收集语言的程序员会学会信任垃圾收集器,而不是与之抗争。如果您使用的是垃圾回收语言,则这些是您要在项目中使用的程序员。不是的程序员习惯于使用垃圾收集语言工作的人本质上对这种“无限内存”抽象表示怀疑,并且经常有很多充分的理由。尽管这些程序员可能很好,但是这些并不是您想要使用垃圾收集语言编写的,因为他们将在每一步与GC进行斗争,不断地猜测它,并且通常会产生速度较慢,内存效率较低的情况代码而不是其他类型的程序员。充其量,他们只会花大量时间重新设计轮子,从而花费大量金钱,甚至需要更多的长期维护成本。

然后,您还需要问自己是否真的很重要。薄熙来的冷嘲热讽评论不仅仅具有真实性:现在的记忆是如此廉价,几乎不值得费力。即使您需要大量资金,这些金额现在也不像10年前那样庞大。程序员和应用程序开发的成本不止是购买RAM和处理能力。这并不意味着您应该尽可能避免经济,而是意味着您也不应浪费太多时间。


1当然,这种假设凸显了该问题中的更深层次的缺陷。事实证明,“ Java或C ++”有点让人讨厌。标准的Java实现提供了垃圾回收,而C ++并非按照语言标准进行,但是绝对没有理由不能将第三方垃圾回收器用于C ++。许多公司靠卖这些东西为生,有些可能靠免费赠送这些东西为生。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.