15

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

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

抱歉,我对所有这些都知之甚少,刚刚开始从事一个项目,所以真的很困惑。因为直到现在我才建了一些学校项目,对比较大的项目一无所知。

4

3 回答 3

20

为什么 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++ 中分配小对象时,还有另一个问题。在 C++ 中,您分配一个对象数组——它们在内存中是连续的,而在 java 中——对象本身不是。在某些情况下,它可能会导致 C++ 具有更好的性能,因为它比 java 程序的缓存效率更高。我曾经在这个线程中解决过这个问题

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

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

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


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

于 2012-08-22T12:54:51.890 回答
9

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

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


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

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

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

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

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

单个一维 Java 数组中的元素数量有一个硬性限制... 2^31。(您可以绕过此限制,但它会使您的代码更加复杂。)

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

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

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

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

听从他们的建议。如果您正在处理那么大的内存数据集,那么他们的担忧是有效的。即使他们的担忧(假设)有点夸大其词,与你的上级/前辈作战也不是一件好事......

于 2012-08-22T12:54:01.153 回答
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++ 总是更可取的。

我定期将 200 - 800 GB 的数据和超过 50 亿个条目加载到单个 Java 进程中(有时在同一台机器上一次不止一个)

1)为什么 C/C++ 在大型数据库/数据结构上总是比 Java 更可取?

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

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

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

Java 只是调用与 C 中相同的系统调用,因此在您可以做什么方面没有真正的区别。

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

归根结底,他们付钱给你,有时技术论点并不重要。;)

于 2012-08-22T13:09:40.697 回答