什么更快-Java或C#(或好的旧C)?

什么更快-Java或C#(或好的旧C)?,c#,java,.net,c,performance,C#,Java,.net,C,Performance,我目前正在决定在一个平台上构建一个科学计算产品,并决定在Core2四CPU上使用英特尔编译器的C#、Java或纯C。主要是整数运算 我的基准到目前为止,java和C的关系是差不多的,.NET/C的跟踪大约5%,但是我的一些同事声称.NET的正确的优化将击败JIT的两个足够的时间来完成它的工作。 我总是假设JIT会在应用程序启动的几分钟内完成它的工作(在我的情况下可能是几秒钟,因为它主要是紧密循环),所以我不确定是否相信他们 有人能解释一下情况吗?NET会打败Java吗?(或者我现在最好还是用C?

我目前正在决定在一个平台上构建一个科学计算产品,并决定在Core2四CPU上使用英特尔编译器的C#、Java或纯C。主要是整数运算

<>我的基准到目前为止,java和C的关系是差不多的,.NET/C的跟踪大约5%,但是我的一些同事声称.NET的正确的优化将击败JIT的两个足够的时间来完成它的工作。 我总是假设JIT会在应用程序启动的几分钟内完成它的工作(在我的情况下可能是几秒钟,因为它主要是紧密循环),所以我不确定是否相信他们

有人能解释一下情况吗?NET会打败Java吗?(或者我现在最好还是用C?)

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

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


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

如果已经有大量的遗留C代码将添加到系统中,那么为什么要使用C#和Java


作为对你最近编辑的关于希望利用处理速度方面的任何改进的回应……那么你最好还是坚持使用C,因为它比C#和Java更接近硬件,而C#和Java需要处理运行时环境的开销。离硬件越近,运行速度就越快。高级语言,如C#和Java,将导致更快的开发时间…但C…或更好的汇编将导致更快的处理时间…但更长的开发时间。

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

它还取决于您是如何做到这一点的——锁定策略、并行化的方式、主代码体等等

Re-JIT-您可以使用NGEN将其展平,但是是的;如果您使用的是相同的代码,那么应该很早就进行JIT

C#/Java(优于C)的一个非常有用的特性是,它们有潜力更好地利用本地CPU(优化等),而无需担心


也使用.NET,考虑诸如“并行扩展”(在4中被捆绑)之类的东西,这给了你一个更强大的线程故事(与没有PFX的.NET相比)。

它将非常依赖于你正在具体做的事情。我有比C代码更好的Java代码。我有比C++代码慢得多的java代码(我不做C·./.NET,所以不能和那些代码说话)。 所以,这取决于你在做什么,我相信你能在语言X中找到比语言Y更快的东西

您是否尝试过通过探查器运行C#代码,以查看它在哪里花费的时间最多(当您使用Java和C时也是如此)。也许你需要做些不同的事情


Java HotSpot虚拟机比.NET虚拟机更成熟(其根源至少可以追溯到1994年),因此这可能归结为两者的代码生成能力因为您的开发时间可能比使用C快得多。如果您最终需要额外的速度,那么您可以随时用C重写一个部分并将其称为模块。

实际上它是“汇编语言”。

我真的对这些基准测试感到惊讶

在计算密集型产品中,我会在C上下很大的赌注,希望它能更快地执行。您可能编写的代码会像筛子一样泄漏内存,并且存在有趣的线程相关缺陷,但速度应该更快

我认为Java或C#会更快的唯一原因是测试的运行时间较短。如果GC很少发生或没有发生,则可以避免实际释放内存的开销。如果该过程是迭代的或并行的,请尝试在您认为已完成一组对象的位置粘贴GC.Collect(在将对象设置为null或以其他方式删除引用之后)

另外,如果您处理的是TB级的数据,我的观点是,使用C语言得到的确定性内存分配会更好。如果您在分配堆的时间附近取消分配,那么您的堆将在很大程度上保持未分割状态。在GC环境中,您很可能会在运行了相当长的一段时间后,使用比您想象的要多得多的内存,这仅仅是因为碎片


对我来说,这听起来像是这样的项目,C将是合适的语言,但需要额外注意内存分配/释放。我的猜测是,如果在一个完整的数据集中运行,C++或java会失败。

如果你使用的是一个高度多线程的代码,我建议你看看即将到来的本地C++应用程序。这将为您节省大量的线程/死锁问题,以及所有其他您将花费大量时间亲自挖掘和解决的问题。
就我自己而言,我真的相信,从长远来看,托管世界中的内存管理将更加高效,并优于本机代码

取决于您编写的应用程序类型。 试试电脑语言基准测试游戏


如果大部分代码都是C语言,为什么不保留它? 原则上
public class MyClass
{
   public int x;

   public static void Main()
   {
      MyClass[] y = new MyClass[1000000];
      for( int idx=0; idx < 1000000; idx++)
      {
          y[idx] = new MyClass();
          y[idx].x = idx;
      }
   }
}
struct MyClass
{
   int x;
}

void Main()
{
   MyClass y[1000000];
   for( int idx = 0; idx < 1000000; idx++)
   {
      y[idx].x = idx;
   }
}