Javaarrays与C ++arrays中的性能和内存使用情况

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

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 ++)将来会对大型数据库/数据结构环境有所帮助? 有什么建议吗?

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

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

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

Java的:

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

C ++:

 [object1,object2,...,objectN] 

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

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

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

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

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


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

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

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


1)他们已经看到Java中的Array [Int-Max] [Int-Max]占用的内存几乎是C的1.5倍,而C ++占用的内存占用量比Java大一些。

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

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

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

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

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

另一方面,如果您只是在阅读和编写文件,Java可以处理最多2 ^ 63字节的单个文件……这比您可能想要的更多。

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

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

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

按照他们的建议去做。 如果您正在处理那么大的内存数据集,那么它们的关注点是有效的。 即使他们的担忧(假设)有点夸大其词,与你的上级/老年人作战也不是一件好事……

1)他们已经看到Java中的Array [Int-Max] [Int-Max]占用的内存几乎是C的1.5倍,而C ++占用的内存占用量比Java大一些。

这取决于具体情况。 如果创建new int[1]new int[1000] ,Java或C ++几乎没有区别。 如果在堆栈上分配数据,则它具有较高的相对差异,因为Java不会将堆栈用于此类数据。

我首先要确保这不是微调应用程序。 值得记住的是,有一天你的时间值(假设你得到最低工资)大概是2.5 GB。 因此,除非您每天节省2.5 GB,否则怀疑它不值得追逐。

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

我有内存映射纯Java程序中的8 TB文件,所以我不知道这是什么。

有一个限制,您不能映射超过2 GB或在数组中有超过20亿个元素。 您可以通过拥有多个(例如最多20亿个)来解决这个问题

由于我们必须处理如此大的数据库/数据结构,因此C / C ++总是更受欢迎。

我经常将超过50亿条目的200 – 800 GB数据加载到一个Java进程中(有时在同一台机器上多次加载一个)

1)为什么C / C ++总是优于Java上的大型数据库/数据结构?

在C / C ++中如何做到这一点比在Java中有更多的经验,他们在如何做到这一点的经验只在C / C ++中。

因为,C可能是,但C ++也是一个OOP。 那么,它如何获得优于Java的优势?

使用大型数据集时,在Java世界中使用单独的数据库更为常见(嵌入式数据库相对较少)

Java只是在C中调用相同的系统调用,因此在您可以执行的操作方面没有真正的区别。

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

在一天结束时,他们付钱给你,有时候技术论证并不重要。 ;)