Java阵列与C++阵列中的性能和内存使用情况

Arp*_*sss 15 c++ java database arrays performance

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

Array [Int-Max] [2] // Large 2D array
Run Code Online (Sandbox Code Playgroud)

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

现在,因为我只知道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++)将来会对大型数据库/数据结构环境有所帮助?有什么建议吗?

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

ami*_*mit 20

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

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

Java的:

[ref1,ref2,ref3,...,refN]
ref1 -> object1
ref2 -> object2
...
refN -> objectN
Run Code Online (Sandbox Code Playgroud)

C++:

[object1,object2,...,objectN]
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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


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

  • @Arpssss:在java中你不能"保持"一个对象,每个变量都是一个原语或对象的引用(而不是对象本身).同样适用于数组中的每个元素(`arr [x]`).它的一个原因 - 是它不需要指针(事实上在java中没有指针).C中的指针给程序员带来了很多麻烦,正如有人向我描述的那样:"它允许程序员同时射击他的双腿." 还有更多内容,但恐怕不是正确的论坛. (2认同)
  • @Arpssss:语言的简单就是这样一个原因.使用嵌入类型的数组要求类型(不是引用,真实类型)是可分配的,这反过来意味着您需要能够生成赋值运算符(否则数组将限于具有用户定义的类型)赋值),并为用户提供覆盖需要深拷贝的情况的行为的方法.下一个问题是你不能再在数组中存储`null`,这反过来意味着类型必须提供一个默认构造函数才能在数组中使用... (2认同)

Ste*_*n C 9

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

我的建议是做他们坚持要做的事.如果他们想要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 Java阵列中的元素数量存在硬性限制... 2 ^ 31.(您可以解决此限制,但这会使您的代码更复杂.)

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

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

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

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

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


Pet*_*rey 7

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

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