Java 数组中的性能和内存使用情况与C++数组

2022-09-03 09:37:10

我在一家小公司工作,在那里我负责构建一些银行软件。现在,我必须构建一些数据结构,例如:

Array [Int-Max] [2] // Large 2D array

将其保存到磁盘,并在第二天加载它以备将来工作。

现在,由于我只知道Java(以及一点点C),他们总是坚持让我使用C++或C。根据他们的建议:

  1. 他们已经看到Java中的Array [Int-Max] [2]将比C占用近1.5倍的内存,C++比Java占用一些合理的内存。

  2. C和C++可以处理任意大的文件,而Java则不能。

根据他们的建议,随着数据库/数据结构变得庞大,Java变得不可行。由于我们必须处理如此大的数据库/数据结构,因此C / C++总是可取的。

现在我的问题是,

  1. 为什么C或C++在大型数据库/数据结构上总是比Java更可取?因为,C可能是,但C++也是一个OOP。那么,它是如何获得优于Java的优势的呢?

  2. 我应该继续使用Java还是他们的建议(切换到C++)将来对大型数据库/数据结构环境有所帮助?有什么建议吗?

对不起,我对所有这些知之甚少,刚刚开始做一个项目,所以真的很困惑。因为到现在为止我只是在建一些学校项目,对比较大的项目一无所知。


答案 1

为什么C / C++在大型数据库/数据结构上总是比Java更可取?因为,C可能是,但C++也是一个OOP。那么,它是如何获得优于Java的优势的呢?

请记住,java数组(对象)1实际上是一个引用数组。为简单起见,让我们看一个一维数组:

爪哇岛:

[ref1,ref2,ref3,...,refN]
ref1 -> object1
ref2 -> object2
...
refN -> objectN

c++:

[object1,object2,...,objectN]

使用C++版本时,数组中不需要引用的开销,数组保存对象本身 - 而不仅仅是它们的引用。如果对象很小 - 此开销可能确实很大。

另外,正如我在注释中已经说过的那样 - 在数组中分配小对象时,还有另一个问题,C++数组中与java。在C++中,您分配一个对象数组 - 它们在内存中是连续的,而在java中 - 对象本身不是。在某些情况下,它可能会导致C++具有更好的性能,因为它比java程序的缓存效率高得多。我曾经在这个帖子中解决这个问题

2)我应该留在Java上还是他们的建议(切换到C++)将来对大型数据库/数据结构环境有所帮助?有什么建议吗?

我不相信我们能为你回答这个问题。您应该了解每个目的的所有优缺点(内存效率,您可以使用的库,开发时间等),并做出决定。不要害怕从您公司的高级开发人员那里获得建议,他们比我们更了解该系统。
如果对这个问题有一个简单易用的答案 - 我们不需要工程师,不是吗?

您还可以在实现内核之前使用预期的数组大小和存根算法来分析代码,并对其进行分析以查看预期的实际差异。(假设数组确实是预期的主空间消耗者)


1:我接下来描述的开销与基元数组无关。在这些情况下(基元),数组是的数组,而不是引用的数组,与C++相同,数组本身的开销很小(例如,字段)。length


答案 2

这听起来像是你在一份新工作中没有经验的程序员。很有可能“他们”已经在这个行业工作了很长时间,并且比你更了解(或至少认为他们知道)这个领域及其编程要求。

我的建议是只做他们坚持要你做的事情。如果他们想要C或C++代码,只需用C或C++编写即可。如果您认为自己会遇到困难,因为您不太了解C / C++...提前警告他们。如果他们仍然坚持,他们可以承担任何问题的责任,并拖延他们的坚持原因。只要确保你尽力而为...并尽量不要成为一个“吱吱作响的轮子”。


1)他们已经看到Java中的Array [Int-Max] [Int-Max]将比C占用近1.5倍的内存,C++需要比Java合理的内存占用。

这是可行的,尽管这取决于数组中的内容。

  • Java可以使用接近最佳内存量来表示大多数基元类型的大型数组。

  • 另一方面,Java中的对象数组可能比C / C++中的对象数组占用更多的空间。例如,在C++中,您通常会分配一个大型数组,以便所有 Foo 实例都是数组实例的一部分。在 Java 中,实际上等效于 ;即指针数组,其中每个指针通常引用不同的对象/堆节点。很容易看出这如何占用更多空间。new Foo[largeNumber]new Foo[largeNumber]new Foo*[largeNumber]

2)C / C++可以处理任意大的文件,而Java则不能。

单个1-D Java数组中的元素数量存在硬性限制...2^31.(您可以解决此限制,但它会使代码更加复杂。

另一方面,如果您只是在谈论读取和写入文件,Java可以处理高达2 ^ 63字节的单个文件...这比你可能想要的要多。

1)为什么C / C++在大型数据库/数据结构上总是比Java更可取?因为,C可能是,但C++也是一个OOP。那么,它是如何获得优于Java的优势的呢?

因为硬性限制。该限制是 JLS 和 JVM 规范的一部分。这与OOP本身无关。

2)我应该留在Java上还是他们的建议(切换到C++)将来对大型数据库/数据结构环境有所帮助?有什么建议吗?

采纳他们的建议。如果您正在处理如此大的内存中数据集,那么它们的关注点是有效的。即使他们的担忧(假设)有点夸大了,与你的上级/老年人作斗争也不是一件好事......