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

时间:2009-04-08 05:42:10

标签: c# java .net c performance

我目前正在决定建立一个科学计算产品的平台,并决定使用Core2 Quad 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#是否会更快。

26 个答案:

答案 0 :(得分:67)

问题中的关键信息是:

  

我们可以削减每一个百分比   处理时间为我们节省了数十个   每年数千美元

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

使用合适的技能(今天更少见,因此更贵),您可以手工编写汇编程序以获得最快的代码。使用稍微不那么罕见(和昂贵)的技能,你可以用一些非常难看的C代码做得很好。等等。你从中挤出的性能越多,你在开发工作中花费的成本就越高,并且会有越来越多的努力回报。如果从中获得的利润保持在“每年数万美元”,那么就会有一个不再值得努力的地步。事实上,我会猜测你已经在那时,因为“每年数万美元”在一个薪水的范围内,而且可能还不足以购买手工优化复杂程序所需的技能。 / p>

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

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

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

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

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

答案 1 :(得分:31)

对不起,但这不是一个简单的问题。这将取决于批次究竟发生了什么。 C#当然不会懈怠,你很难说“java更快”或“C#更快”。 C是一个非常不同的野兽...它可能有更快的速度 - 如果你做得对;但在大多数情况下,它会大致相同,但更难写。

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

重新JIT - 您可以使用NGEN来平整这个,但是是的;如果你打的是相同的代码,它应该很早就被JIT。

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

此外 - 使用.NET,可以考虑“并行扩展”(将在4.0中捆绑),这样可以提供更强大的线程故事(与没有PFX的.NET相比)。

答案 2 :(得分:13)

不要担心语言;并行化!

如果您拥有高度多线程,数据密集型的科学代码,那么我认为担心语言不是最重要的问题。我认为您应该专注于使应用程序并行,特别是使其扩展到单个节点。这将比仅仅切换语言带来更多性能。

只要你被限制在一个节点上,你就会因为应用程序的计算能力和带宽而挨饿。在即将推出的多核机器上,目前尚不清楚您是否拥有在所有内核上进行数据密集型计算所需的带宽。您可以进行计算密集型工作(如GPU所做的那样),但如果您需要将大量数据流式传输到每个核心,则可能无法提供所有核心。

我认为你应该考虑两个选择:

  1. <强>的MapReduce
    你的问题听起来像Hadoop这样的东西非常匹配,它是专为数据密集型工作而设计的。

    Hadoop已在Linux上扩展到10,000个节点,您可以将您的工作分流到其他人(例如亚马逊,微软)或您自己的计算云。它是用Java编写的,因此就移植而言,您可以从Java中调用现有的C代码,也可以将整个内容移植到Java。

  2. <强> MPI
    如果您不想打扰移植到MapReduce,或者由于某些原因您的并行范例不适合MapReduce模型,您可以考虑调整您的应用以使用MPI。这也允许您扩展到(可能数千个)核心。 MPI是计算密集型分布式内存应用程序的事实标准,我相信有Java绑定,但大多数人使用MPI与C,C ++和Fortran。因此,您可以将代码保存在C中,并专注于并行化性能密集型部分。如果您有兴趣,请查看OpenMPI作为初学者。

答案 3 :(得分:11)

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

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

我认为Java或C#会更快的唯一原因是测试的运行时间很短。如果很少或没有GC发生,你将避免实际释放内存的开销。如果该过程是迭代或并行的,请尝试坚持使用GC.Collect,无论您认为自己已经完成了一堆对象(在将事物设置为null或以其他方式删除引用之后)。

另外,如果你正在处理数TB的数据,我的意见是你用C得到的确定性内存分配会好得多。如果你大致接近分配你的堆就会停止分配很大程度上没有分割。使用GC环境,您可能会在运行时间长于预期后使用更多的内存来结束您的程序,仅仅是因为碎片。

对我而言,这听起来像C语言是适当语言的那种项目,但需要对内存分配/释放进行一些额外的关注。我敢打赌,如果在完整的数据集上运行,C#或Java将会失败。

答案 4 :(得分:9)

很久以前Raymond ChenRico Mariani有一系列博客文章逐步优化文件加载到字典工具中。尽管早期.NET更快(即易于快速),但C / Win32方法最终显着更快 - 但相当复杂(例如使用自定义分配器)。

最后答案更快将在很大程度上取决于你愿意花费多少时间在每个方法的每微秒上进行一次。这种努力(假设您在真实的剖析器数据的指导下正确地完成)将比语言/平台的选择产生更大的差异。


第一个和最后一个性能博客条目:

(最后一个链接给出了结果和一些分析的总体摘要。)

答案 5 :(得分:5)

这将非常依赖于你正在做什么。我有Java代码胜过C代码。我的Java代码比C ++代码要慢得多(我不做C#/ .NET,所以不能说那些)。

所以,这取决于你在做什么,我相信你可以找到语言X比语言Y更快的东西。

您是否尝试通过分析器运行C#代码以查看花费最多时间(与Java和C相同)。也许你需要做一些不同的事情。

Java HotSpot VM比.NET更成熟(至少可以追溯到1994年),因此它可能归结为两者的代码生成能力。

答案 6 :(得分:5)

你说“代码是多线程的”,这意味着算法是可并行的。此外,您保存“数据集大小为几TB”。

优化就是找到并消除瓶颈。

明显的瓶颈是数据集的带宽。考虑到数据的大小,我猜测数据是保存在服务器而不是台式机上。您还没有提供您正在使用的算法的任何细节。算法所花费的时间是否大于读取/写入数据/结果所花费的时间?算法是否适用于总数据的子集?

我将假设该算法适用于数据块而不是整个数据集。

您需要考虑两种情况:

  1. 该算法处理数据所需的时间比获取数据所需的时间长。在这种情况下,您需要优化算法。

  2. 该算法处理数据所需的时间少于获取数据所需的时间。在这种情况下,您需要增加算法和数据之间的带宽。

  3. 在第一种情况下,您需要一个能编写好汇编程序代码的开发人员,以充分利用您正在使用的处理器,如果可用的话,可以利用SIMD,GPU和多核。无论你做什么,不要只是增加线程数,因为一旦线程数超过内核数量,你的代码就会变慢!这是由于切换线程上下文的额外开销。另一种选择是使用像分布式处理系统这样的SETI(组织中有多少台PC用于管理目的 - 想想所有备用处理能力!)。 C#/ Java,如bh213所提到的,可能比使用SIMD等编写得很好的C / C ++慢一个数量级。但是这些天技能集当初。

    在后一种情况下,在受带宽限制的情况下,您需要改善将数据连接到处理器的网络。在这里,请确保您使用的是最新的以太网设备 - 各地1Gbps(PC卡,交换机,路由器等)。不要使用无线,因为速度较慢。如果有很多其他流量,请考虑与“办公室”网络并行的专用网络。考虑将数据存储得更靠近客户端 - 每五个客户端使用一个直接连接到每个客户端的专用服务器,它反映来自服务器的数据。

    如果节省几个百分点的处理时间可节省“数万美元”,那么请认真考虑聘请一名顾问,实际上是两个 - 一个软件,一个网络。他们应该轻松地为所节省的费用付出代价。我相信这里有很多人都有资格提供帮助。

    但是如果降低成本是最终目标,那么考虑Google's approach - 编写使CPU保持在100%以下的代码。这通过减少冷却直接和间接地节省能量,因此成本更低。你需要更多的回报,所以它再次是C / C ++ - Java / C#有更多的开销,开销=更多的CPU工作=更多的能量/热量=更多的成本。

    因此,总而言之,在节省资金方面,除了你要选择的语言之外还有很多其他内容。

答案 7 :(得分:4)

我参加了一些TopCoder的马拉松比赛,其中表现是他们胜利的关键。

我的选择是C#。我认为C#解决方案略高于Java,并且比C ++慢得多......直到有人用C ++编写了一个快一个数量级的代码。你被赋予了使用英特尔编译器的权限,获胜的代码充满了SIMD的存在,你无法用C#或Java复制它。但是如果SIMD不是一个选项,只要你注意正确使用内存(例如,监视缓存未命中并尝试限制内存访问L2缓存的大小),C#和Java就应该足够好了。

答案 8 :(得分:4)

如果已经有大量遗留C代码添加到系统中,那么为什么要迁移到C#和Java?

为了回应您最近想要利用处理速度的任何改进的编辑....那么您最好的选择是坚持使用C,因为它比C#和Java更接近硬件而且具有开销要处理的运行时环境。越接近硬件,您就可以越快地运行。诸如C#和Java等高级语言将导致更快的开发时间......但是C ......或更好的装配将导致更快的处理时间......但开发时间更长。

答案 9 :(得分:3)

答案 10 :(得分:3)

实际上它是'汇编语言'。

答案 11 :(得分:3)

重申评论,如果您正在进行算术科学计算,那么您应该使用GPU而不是CPU。如果Matlab许可不是问题,那么Matlab with CUDA plugins将比Java或c#更令人敬畏。 nVidia文档显示了如何将任何CUDA函数编译为mex文件。如果你需要免费软件,我喜欢pycuda。

但是,如果GPU不是一个选项,我个人喜欢C的很多例程,因为编译器的优化并不像JIT那么复杂:你不必担心“类”是否变得像“结构”与否。根据我的经验,通常可以分解问题,使得更高级别的东西可以用非常富有表现力的语言编写,如Python(丰富的原语,动态类型,非常灵活的反射),并且转换可以用C语言编写。此外,如果您选择使用C / C ++路由,那么有一些简洁的编译器软件,如PLUTO(自动循环并行化和OpenMP代码生成),以及像Hoard,tcmalloc,BLAS(CUBLAS for gpu)等库。

答案 12 :(得分:3)

有一点需要注意的是,如果您的应用程序受益于lazy evaluation,那么像Haskell这样的函数式编程语言可能会产生与最佳结构化/ OO代码完全不同的加速度通过不评估不必要的分支。

另外,如果您正在谈论更好性能的货币收益,请不要忘记将维护软件的成本添加到等式中。

答案 13 :(得分:3)

你的问题是措辞不当(或至少标题是),因为它暗示这种差异是地方性的,并适用于所有java / c#/ c代码的实例。

值得庆幸的是,问题的主体是更好的措辞,因为它提供了一个相当详细的解释代码正在做的事情。它没有说明您正在使用的c#/ java运行时版本(或提供程序)。它也没有说明代码将运行的目标体系结构或机器。这些事情会产生很大的不同。

你做了一些基准测试,这很好。一些建议,了解您为什么会看到您的结果:

  • 你不像在java / c那样擅长编写高性能的c#代码(这不是批评,甚至可能是你应该考虑的真实可能性)
  • JVM的后续版本进行了一些严格的优化,可以非常快速地实现无竞争锁定。这可能会对您有利(尤其是与您正在使用的c实现线程原语的比较)
  • 由于java代码与c代码相比似乎运行良好,因此很可能您并不十分依赖堆分配策略(分析会告诉您这一点)。
  • 由于c#代码的运行效果不如java代码(假设代码具有可比性),因此存在几个可能的原因:
    • 您正在使用(不必要的)JVM将内联的虚拟函数,但CLR不会
    • 最新的JVM做Escape Analysis,这可能会使一些代码路径更加高效(特别是那些涉及字符串操作,其生命周期是堆栈绑定的
    • 只有最新的32位CLR才会内联涉及非原始结构的方法
    • 一些JVM JIT编译器使用热点样式机制,试图检测代码的“热点”并花费更多精力重新编写代码。

如果不了解代码花费的大部分时间,那么就无法提出具体的建议。我可以很容易地编写在CLR下执行得更好的代码,因为在对象上使用结构或者像非盒装泛型一样定位CLR的运行时特定功能,这作为一般性陈述几乎不具有指导意义。

答案 14 :(得分:2)

用一种语言或另一种语言写作只能为您提供大量工作的小幅加速。要真正加快速度,您可能需要查看以下内容:

  1. 购买最新的最快硬件。
  2. 从32位操作系统移至64位。
  3. 网格计算。
  4. CUDA / OpenCL。
  5. 使用矢量化等编译器优化。

答案 15 :(得分:2)

肯定的答案是购买最新的PC,你能买得起最多的核心/处理器。如果你购买最新的2x4核心PC,你会发现它不仅有两次尽可能多的内核作为四核,但它们的运行速度比上一代处理器/机器快25-40%。

这将为您提供大约150%的加速。远不只是选择Java / C#或C. 如果你继续购买新盒子,那么每18个月你会再次获得相同的效果!

您可以坐在那里几个月重写代码,或者我今天下午可以去我当地的PC商店,比当天的所有工作都快。

提高代码质量/效率是好的,但有时候实施资金会更好地用于其他地方。

答案 16 :(得分:1)

取决于您的基准测试和硬件。我认为这是速度而不是内存或CPU使用率。但是......

如果您的应用专用机器只有非常大的内存,那么java可能会快5%。

如果你在现实世界中使用有限的内存和更多的应用程序在同一台机器上运行.net在利用计算资源方面看起来更好:see here

如果硬件受到很大限制,C / C ++就会失败。

答案 17 :(得分:1)

我会使用C#(或Java),因为你的开发时间可能比用C快得多。如果你最终需要额外的速度那么你总是可以在C中重写一个部分并调用它作为一个模块。

答案 18 :(得分:1)

我的偏好是C或C ++,因为我没有通过JIT编译器与机器语言分离。

您希望进行强烈的性能调整,这意味着一次一个指令单步执行热点,看看它在做什么,然后调整源代码以生成最佳汇编程序。

如果您无法让编译器生成您认为足够好的汇编程序代码,那么请务必为热点编写自己的汇编程序。您描述的是对性能需求至关重要的情况。

如果我在你的鞋子里(或曾经),我不会做的事情是依赖于一种语言比另一种语言更快或更慢的轶事概括。我要做的是沿着THISTHIS以及THIS的线路进行多次强烈的性能调整。我已经做了很多次这样的事情,关键是要重复诊断和修复的循环,因为固定的每一个子弹使剩下的那些更明显,直到你真的无法挤出萝卜的另一个循环。 / p> 祝你好运。

补充:是否存在一些很少变化的配置信息,这些信息决定了大部分数据的处理方式?如果是这样,可能是程序花费大量时间重新解释配置信息以确定下一步该做什么。如果是这样,编写一个代码生成器通常是一个很大的胜利,它将读取配置信息并生成一个特殊的程序,可以通过数据查找,而无需经常弄清楚要做什么。

答案 19 :(得分:0)

我会考虑其他人使用的东西 - 不是本网站上的人,而是那些编写相同类型的大规模并行或超高性能应用程序的人。

我发现他们都用C / C ++编写代码。所以,仅仅为了这个事实(即不管语言之间的速度问题如何),我会选择C / C ++。如果你用同一种语言写作,他们使用和开发的工具对你来说会更有用。

除此之外,我发现C#应用程序在某些方面的性能稍差,多线程就是其中之一。 .NET会尽量避免线程问题(在大多数情况下可能是好事),但这会导致您的特定案例问题(测试:尝试编写一个使用大量线程访问共享对象的简单循环。运行该在单核PC上你获得比在多核盒上运行它更好的性能 - .net正在添加自己的锁以确保你不会破坏它()我使用了Jon Skeet's singleton基准测试。静态锁定在我的旧笔记本电脑上花了1.5秒,在我的超高速桌面上花了8.5秒,锁定版本更糟糕,自己尝试一下)

接下来的一点是,使用C,您倾向于直接访问内存和数据 - 没有任何障碍,使用C#/ Java,您将使用提供的许多类中的一些。这些在一般情况下都会很好,但是您可以采用最佳,最有效的方式来访问它(对于您的情况来说,对于数TB的数据而言,这些类的设计并未考虑到这些数据集) ,它们是为其他人使用的常见情况而设计的,所以再一次,你会更安全地使用C - 你永远不会让一个在内部创建新字符串的类时被GC堵塞,当你读取几个太字节时如果你用C语言写的数据!

因此,看起来C#/ Java可以为您提供优于本机应用程序的优势,但我认为您会发现这些优势仅适用于通常编写的业务线应用程序。

答案 20 :(得分:0)

这里已经说过最重要的事情了。我想补充一下:

开发者利用编译器利用的语言来生成机器指令,处理器利用该机器指令来使用系统资源。当链的所有部分都达到最佳状态时,程序将“快速”。

因此,对于“最佳”语言选择:

  • 选择您最能控制的语言
  • 能够充分指导编译器
  • 生成近乎最佳的机器代码,以便
  • 目标计算机上的处理器能够最佳地利用处理资源。

如果您不是表演专家,您将很难在任何语言中达到“最佳表现”。可能C ++仍然提供了控制机器指令的最多选项(特别是SSE扩展a.s.o)。

我建议以着名的80:20规则为导向。这对所有人来说都是如此:硬件,语言/平台和开发人员的努力。

开发人员一直依靠硬件来自动修复所有性能问题,因为升级到更快的处理器f.e ..过去可能工作的东西在(最近的)未来不起作用。开发人员现在有责任相应地构建程序以实现并行执行。虚拟机和虚拟运行时环境的语言将在此处显示出一些优势。即使没有大规模的并行化,也很少有理由认为C#Java不能像C ++那样成功。

@Edit:看到这个comparison of C#, Matlab and FORTRAN,FORTRAN并不孤单!

答案 21 :(得分:0)

如果每个百分比真的能为您节省数万美元,那么您应该聘请领域专家来帮助您完成项目。精心设计和编写的代码在初始阶段考虑的性能可能会快一个数量级,节省90%或900,000美元。我最近在一些代码中发现了一个微妙的缺陷,加速了一个过程超过100次。我的一位同事发现了一个在O(n ^ 3)中运行的算法,他重写了该算法使其成为O(N log n)。这往往是巨大的性能节省。

如果问题非常简单以至于您无法使用更好的算法来节省大量成本,那么C很可能是您最好的语言。

答案 22 :(得分:0)

请注意,对于繁重的计算,有一个很好的优点,就是可以在CPU的第一级缓存中使用紧密循环,因为它避免了必须反复使用较慢的内存来获取指令。

即使对于二级缓存,像Quake IV这样的大型程序在4 Mb二级缓存与1 Mb二级缓存相比性能提升了10% - http://www.tomshardware.com/reviews/cache-size-matter,1709-5.html

对于这些紧密循环,C最有可能是最好的,因为您可以最大程度地控制生成的机器代码,但对于其他所有内容,您应该选择具有最佳库的平台来完成您需要执行的特定任务。例如,netlib库被认为对于一大堆问题具有非常好的性能,并且可以使用许多其他语言的端口。

答案 23 :(得分:0)

如果您的大部分代码都在C中,为什么不保留它? 原则上和设计显然C更快。它们可能会随着时间的推移缩小差距,但它们总是具有更高水平的间接性和“安全性”。 C很快,因为它“不安全”。想想绑定检查。每个语言都支持与C的接口。所以我不明白为什么如果C代码仍在工作并且以你喜欢的任何语言使用它,我们就不愿意将C代码包装起来

答案 24 :(得分:0)

如果您使用的是高度多线程的代码,我建议您查看即将发布的Task Parallel Library (TPL) for .NET and the Parallel Pattern Library (PPL)本机C ++应用程序。这将为您节省很多线程/死锁的问题以及您将花费大量时间进行自我解决的所有其他问题。 对于我自己,我真的相信托管世界中的内存管理将更有效率并且长期击败本机代码。

答案 25 :(得分:-6)

参考值; “我的基准测试到目前为止显示Java和C相互之间的差不多

然后你的基准测试存在严重缺陷......

除了你做了严重的错误之外,C总是比C#和Java快几个数量级的订单...!

PS! 请注意,这不是试图欺负C#也不是Java,我喜欢Java和C#,还有其他原因可以解决许多问题,选择Java或C#而不是C.但是Java和C#都不会正确的书面测试永远不能以与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;
      }
   }
}

反对这一个(C)

struct MyClass
{
   int x;
}

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

首先,C#版本需要将其数组存储在堆上。 C版本将数组存储在堆栈中。将内容存储在堆栈上只是改变整数值的值,而在堆上存储东西意味着找到足够大的内存块并且可能意味着遍历内存很长时间。

现在,大多数C#和Java都会分配大量的内存,而这些内存会一直在消耗,直到它出现,这使得这个逻辑执行得更快。但即便如此,将此与改变整数值进行比较,就像F16快速对抗油轮......

其次在C版本中,因为所有这些对象已经在堆栈中,所以我们不需要在循环中显式创建新对象。然而,对于C#,这是“寻找可用的内存操作”,而C版本是ZIP(不做任何操作

第三,事实是C版本在超出范围时会自动删除所有这些对象。然而,这又是一个仅改变整数值的操作。在大多数CPU架构中,这将占用1到3个CPU周期。 C#版本没有这样做,但是当垃圾收集器启动并需要收集这些项目时,我猜我们正在谈论CPU循环的 MILLIONS ......

此外,C版本将立即成为x86代码(在x86 CPU上),而C#版本将首先成为IL代码。然后在执行时,它必须被JIT编译,这可能只需要更长的时间,然后只执行C版本。

现在有些聪明人可能会执行上面的代码并测量CPU周期。然而,这基本上没有任何意义,因为数学上已经证明托管版本可能需要几百万倍的CPU周期作为C版本。所以我的猜测是,我们现在谈论的是这个例子中5-8个数量级的速度。当然,这是一个“操纵测试”,因为我“寻找某些东西来证明我的观点”,但是我挑战那些在这篇文章上严厉批评我的人来创建一个不执行的样本在C中速度更快,并且由于存在“更好的替代方案”,因此也不会使用通常从未在C中使用的构造。

请注意,C#和Java是GREAT语言。我比C 任何时候都更喜欢他们。但不是因为它们更快。因为他们不是。它们总是比C和C ++慢。除非你用C或C ++蒙上眼睛编码......

编辑;

C#当然有 struct 关键字,如果我们通过使用关键字 struct将C#类更改为值类型,这将严重改变上述C#版本的速度em>而不是 class 。 struct关键字意味着C#将在堆栈中存储给定类型的新对象 - 对于上述示例,将严重增加速度。上面的示例恰好也包含了这些对象的数组。

即使我们经历并优化了这样的C#版本,我们仍然会得到比C版本慢几个数量级的东西......

好的编写的C代码将总是比C#,Java,Python和更快的管理语言 - 选择 > ...

正如我所说,我喜欢C#,我今天做的大部分工作都是C#而不是C.但是我不使用C#,因为它比C更快。我使用C#因为我不需要速度增益C给了我大部分的问题。

C#和Java虽然可笑比C和C ++慢得多......