什么是更快的 - Java或C#(或更好的旧C)?[已关闭]

2022-09-01 13:27:40

我目前正在决定一个平台来构建一个科学的计算产品,并且正在决定使用C#,Java或Core2 Quad CPU上的英特尔编译器的普通C。它主要是整数算术。

到目前为止,我的基准测试表明Java和C彼此相当,.NET / C#落后约5% - 但是我的一些同事声称,如果JIT有足够的时间来完成其工作,那么具有正确优化的.NET将击败这两者。

我总是假设JIT会在应用程序启动后的几分钟内完成它的工作(在我的情况下可能是几秒钟,因为它主要是紧密循环),所以我不确定是否相信它们

谁能对局势有所了解?.NET 会击败 Java 吗?(或者我最好在这一点上坚持使用C?

代码是高度多线程的,数据集的大小为几 TB。

在这种情况下,Haskell/Erlang 等不是选项,因为有大量现有的遗留 C 代码将被移植到新系统中,而将 C 移植到 Java/C# 比移植到 Haskell 或 Erlang 要简单得多。(当然,除非这些提供了显着的加速)。

编辑:我们正在考虑迁移到C#或Java,因为从理论上讲,它们可能会更快。我们每减少一个百分点的处理时间,每年就能为我们节省数万美元。在这一点上,我们只是试图评估C,Java或C#是否会更快。


答案 1

问题中的关键信息是这样的:

我们每减少一个百分点的处理时间,每年就能为我们节省数万美元。

因此,您需要考虑削减每个百分比的成本。如果这种优化工作每年花费数万美元,那么它就不值得去做。你可以通过解雇一个程序员来节省更多的钱。

有了正确的技能(今天更罕见,因此更昂贵),你可以手工制作汇编程序来获得最快的代码。有了稍微不那么罕见(和昂贵)的技能,你几乎可以用一些看起来非常丑陋的C代码来做。等等。您从中榨取的性能越多,就越会在开发工作中花费您,并且更大的努力的回报将会减少。如果从中获得的利润保持在“每年数万美元”,那么将有一个点,它不再值得付出努力。事实上,我冒昧地猜测你已经到了这一点,因为“每年数万美元”在一份薪水的范围内,可能不足以购买手工优化复杂程序所需的技能。

我猜想,如果你已经用C语言编写了代码,那么将其全部重写为另一种语言的直接翻译的努力将浪费90%的精力。它很可能执行得更慢,因为你不会利用平台的功能,而是反对它们,例如,试图像使用C一样使用Java。

此外,在现有代码中,会有一些部分对运行时间做出至关重要的贡献(它们经常运行),而其他部分则完全不相关(它们很少运行)。因此,如果您对加快程序速度有一些想法,那么浪费时间将其应用于程序中不影响运行时间的部分就没有经济意义。

因此,请使用探查器查找热点,并查看现有代码中浪费时间的位置。

当我注意到对代码的引用是“多线程”时更新

在这种情况下,如果您将精力集中在消除瓶颈上,以便您的程序可以在大量内核上很好地扩展,那么它每年都会自动变得更快,其速度将使您可以进行的任何其他优化相形见绌。明年这个时候,四核将成为台式机的标准配置。在那之后的一年里,8核将变得越来越便宜(我一年前花了几千美元买了一个),我预测到那时,一台32核机器的成本将低于开发人员。


答案 2

我很抱歉,但这不是一个简单的问题。这在很大程度上取决于到底发生了什么。C#当然不是懒惰的,你很难说“java更快”或“C#更快”。C是一个非常不同的野兽...它可能有可能更快 - 如果你做对了;但在大多数情况下,它会大致相同,但写起来要困难得多。

它还取决于你如何做到这一点 - 锁定策略,你如何进行并行化,主代码体等。

Re JIT - 您可以使用NGEN来扁平化它,但是是的;如果你正在点击相同的代码,它应该很早就被JITted。

C#/Java(在C之上)的一个非常有用的功能是,它们有可能更好地利用本地CPU(优化等),而不必担心。

另外 - 对于.NET,请考虑诸如“并行扩展”之类的东西(将捆绑在4.0中),这为您提供了更强大的线程故事(与没有PXX的.NET相比)。


推荐