我在一家小公司工作,在那里我致力于构建一些银行软件。现在,我必须构建一些数据结构,如:
Array [Int-Max] [2] // Large 2D array
将其保存到磁盘并在第二天加载以备将来工作。
现在,因为我只知道Java(和一点点C),所以他们总是坚持使用C ++或C.根据他们的建议:
他们已经看到Java中的Array [Int-Max] [2]占用的内存几乎是C的1.5倍,而C ++占用的内存占用的内存比Java要好。
C和C ++可以处理Java无法处理的任意大文件。
根据他们的建议,随着数据库/数据结构变得庞大,Java变得不可行。由于我们必须处理如此大的数据库/数据结构,因此C / C ++总是更受欢迎。
现在我的问题是,
为什么C或C ++总是优于Java上的大型数据库/数据结构?因为,C可能是,但C ++也是一个OOP。那么,它如何获得优于Java的优势呢?
我是否应继续使用Java或他们的建议(切换到C ++)将来会对大型数据库/数据结构环境有所帮助?有什么建议吗?
抱歉,我对所有这些知识知之甚少,刚刚开始研究项目,所以真的很困惑。因为到现在为止我刚建了一些学校项目,不知道相对较大的项目。
答案 0 :(得分:19)
为什么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程序具有更高的缓存效率。我曾在this thread
中解决了这个问题2)我应该继续使用Java还是他们的建议(切换到C ++) 在未来的大型数据库/数据结构环境中有用吗?任何 建议?
我不相信我们能为你解答。您应该了解每个的所有优点和缺点(内存效率,可以使用的库,开发时间......)以达到您的目的并做出决定。不要害怕从贵公司的老年开发人员那里得到建议,他们有更多关于系统的信息。
如果这个问题有一个简单易懂的通用答案 - 我们不需要工程师,不是吗?
您还可以在实现核心之前使用预期的数组大小和存根算法来分析您的代码,并对其进行分析以查看预期的真正差异。 (假设数组确实是预期的主要空间消费者)
1:我接下来要描述的开销与基元数组无关。在这些情况下(基元),数组是值的数组,而不是引用的数组,与C ++相同,对数组本身的开销很小(length
字段,例如)。
答案 1 :(得分: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 ++)将来会对大型数据库/数据结构环境有所帮助?有什么建议吗?
继续他们的建议。如果您正在处理那么大的内存数据集,那么它们的关注点是有效的。即使他们的担忧(假设)有点夸大其词,与你的上级/老年人作战也不是一件好事......
答案 2 :(得分: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比在Java中有更多的经验,他们在如何做到这一点的经验仅在C / C ++中。
因为,C可能是,但C ++也是OOP。那么,它如何获得优于Java的优势呢?
使用大型数据集时,在Java世界中使用单独的数据库更为常见(嵌入式数据库相对较少)
Java只能在C中调用相同的系统调用,因此在您可以执行的操作方面没有真正的区别。
2)我是否应继续使用Java或他们的建议(切换到C ++)将来会对大型数据库/数据结构环境有所帮助?有什么建议吗?
在一天结束时,他们付钱给你,有时候技术论证并不重要。 ;)