什么更快呢?Java还是C#?(或者好的老C)?

What is faster- Java or C# (or good old C)?

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

到目前为止,我的基准显示Java和C彼此相当,并且.NET/C落后于5%左右,但是我的一些同事声称.NET与正确的优化将击败这两个给定的足够的时间来完成JIT的工作。

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

有人能透露情况吗?.NET打败Java吗?(还是我现在最好还是坚持C?).

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

在这种情况下,Haskell/Erlang等不是可选的,因为存在大量的遗留C代码,它们将被移植到新的系统中,并且移植C到Java/C是比Haskell或Erlang简单得多。(当然,除非这些能显著加速)。

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


问题的关键信息是:

Every percent we can shave off our
processing time saves us tens of
thousands of dollars per year

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

有了正确的技能(现在比较少见,因此也比较贵),您可以手工装配程序以获得最快的代码。有了稍微不那么罕见(和昂贵)的技能,您可以用一些看起来很难看的C代码做得差不多。等等。您从中榨取的性能越多,在开发工作中所花费的成本就越高,而且对于更大的工作,回报也会减少。如果从中获得的利润保持在"每年数万美元"的水平,那么就有一点不再值得付出努力了。事实上,我冒昧地猜测你已经到了那个时候,因为"每年数万美元"在一个工资范围内,而且可能不足以购买手工优化复杂计划所需的技能。

我想,如果您已经用C语言编写了代码,那么用另一种语言将代码全部重写为直接翻译的工作将浪费90%的精力。它很可能会很慢地执行,因为你不会利用平台的能力,而是相反地工作,例如尝试使用Java,就好像它是C一样。

同样,在您现有的代码中,会有一些对运行时间做出关键贡献的部分(它们经常运行),以及其他完全不相关的部分(它们很少运行)。因此,如果你有加速程序的想法,那么把它应用到程序中不影响运行时间的部分就没有经济意义了。

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

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

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


对不起,这不是一个简单的问题。这将很大程度上取决于到底发生了什么。C当然不是一个懒散的人,你很难说"Java更快"或者"C更快"。C是一种完全不同的野兽…它可能会更快——如果你把它弄好的话;但在大多数情况下,它是一样的,但写起来要困难得多。

它还取决于您如何进行锁定策略、如何进行并行化、主代码体等。

re-jit-你可以使用ngen将其扁平化,但是是的;如果你使用的是相同的代码,那么应该很早就进行抖动。

C语言的一个非常有用的特性(C)是,它们有可能更好地利用本地CPU(优化等),而不用担心。

另外,对于.NET,考虑类似"并行扩展"(捆绑在4.0中),它提供了一个更强大的线程故事(与没有pfx的.NET相比)。


不要担心语言;并行化!

如果你有一个高度多线程,数据密集的科学代码,那么我不认为担心语言是你最大的问题。我认为您应该集中精力使您的应用程序并行,尤其是使它能够扩展到单个节点之外。这将使您的性能远远超过仅切换语言。

只要你被限制在一个节点上,你就会为你的应用程序缺乏计算能力和带宽。在即将到来的许多核心机器上,还不清楚您是否拥有在所有核心上进行数据密集型计算所需的带宽。你可以做计算密集型的工作(就像GPU那样),但是如果你需要将大量的数据流到每一个核心上,你可能无法提供所有的核心。

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

  • MapReduce你的问题听起来很像Hadoop,它是为数据密集型工作而设计的。

    Hadoop已经在Linux上扩展到了10000个节点,您可以将您的工作转移到其他人(如Amazon、Microsoft)或您自己的计算云上。它是用Java编写的,所以就移植而言,你可以从Java内部调用你现有的C代码,或者你可以把整个东西移植到Java。

  • MPI如果您不想麻烦移植到MapReduce,或者由于某种原因您的并行范式不适合MapReduce模型,您可以考虑调整应用程序以使用MPI。这还允许您扩展到(可能是数千个)核心。MPI是计算密集型分布式内存应用的事实上的标准,我相信有Java绑定,但大多数人使用MPI与C、C++和FORTRAN。因此,您可以将代码保存在C中,并将重点放在并行化性能密集型部分上。如果您感兴趣,可以先看看OpenMPI。


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

    在计算密集型产品中,我会对C下大赌注以提高性能。您可能会编写像筛子一样泄漏内存的代码,并且有一些与线程相关的有趣缺陷,但是应该更快。

    我认为Java或C更快的唯一原因是测试上的短运行长度。如果很少或没有发生GC,您将避免实际释放内存的开销。如果过程是迭代的或并行的,请尝试在您认为完成了一组对象的任何位置粘贴一个gc.collect(在设置为空或删除引用之后)。

    另外,如果您处理的是万亿字节的数据,我的观点是,您将更好地处理使用C得到的确定性内存分配。如果您大致在分配堆的时候释放,那么堆将基本上不会崩溃。在一个GC环境中,在经过一段相当长的运行时间后,您的程序可能会使用比您想象的更多的内存,这仅仅是因为碎片。

    对我来说,这听起来像是一种项目,其中C是适当的语言,但需要额外注意内存分配/释放。我敢肯定的是,如果运行在一个完整的数据集中,Cype或Java将失败。


    很早以前,RaymondChen和RicoMariani发表了一系列博客文章,逐步优化了将文件加载到字典工具中的过程。虽然.NET在早期速度更快(即易于快速实现),但C/Win32方法最终速度明显更快——但相当复杂(例如使用自定义分配器)。

    最后,速度更快的答案将在很大程度上取决于你愿意花费多少时间在每一种方法的每一微秒的心电图上。这项工作(假设您正确地完成了这项工作,由真实的分析器数据指导)将比语言/平台的选择产生更大的差异。

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

    • 陈第1部分
    • Mariani第1部分
    • 检查最终零件
    • 马里亚尼最后一部分

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


    这将很大程度上取决于你具体在做什么。我有一个打败C代码的Java代码。我有比C++代码慢得多的Java代码(我不做C.Y./.NET,所以不能和那些代码说话)。

    所以,这取决于你在做什么,我相信你能找到在语言x中比语言y更快的东西。

    您是否尝试过通过剖析器运行C代码,以查看它占用的时间最长(与Java和C相同)。也许你需要做些不同的事情。

    Java热点VM比.NET一个更成熟(它的根返回到至少1994个),因此它可以归结为两者的代码生成能力。


    你说"代码是多线程的",这意味着算法是可并行的。此外,您还保存了"数据集的大小为几兆字节"。

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

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

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

    您需要考虑两种情况:

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

  • 该算法处理数据的时间比获取数据的时间短。在这种情况下,您需要增加算法和数据之间的带宽。

  • 在第一种情况下,您需要一个能够编写好汇编程序代码的开发人员来充分利用您所使用的处理器,如果它们可用的话,可以利用SIMD、GPU和多核。无论您做什么,不要只是增加线程的数量,因为一旦线程数量超过核心数量,您的代码就会变慢!这是因为切换线程上下文增加了开销。另一个选择是使用一个类似SETI的分布式处理系统(您组织中有多少台PC用于管理目的——想想所有的备用处理能力!)C.Y/JAVA,如B2H13所提到的,可以比使用SIMD等编写的C/C++更慢一个数量级,但这是一个利基技巧。

    在后一种情况下,如果受带宽限制,则需要改进将数据连接到处理器的网络。在这里,请确保您使用的是最新的以太网设备-每个地方都有1Gbps(PC卡、交换机、路由器等)。不要使用无线,因为那样会慢一些。如果有很多其他流量,考虑与"办公室"网络并行的专用网络。考虑将数据存储在离客户机更近的地方——大约每五个客户机就使用一个直接连接到每个客户机的专用服务器来镜像来自服务器的数据。

    如果节省处理时间的百分之几可以节省"几万美元",那么认真考虑聘请一名顾问,两个实际上是一个软件,一个网络。他们应该很容易地用储蓄来支付自己。我相信这里有很多人都有资格提供帮助。

    但是,如果降低成本是最终目标,那么考虑一下谷歌的方法——编写代码,使CPU保持在100%以下。这通过减少冷却直接和间接地节省了能源,从而降低了成本。你会想要更多的Buck,因为它是C/C++,爪哇/C有更多的开销,开销=更多CPU工作=更多的能量/热量=更多的成本。

    所以,总的来说,当涉及到省钱时,它比你要选择的语言要多得多。


    如果已经有大量的遗留C代码会被添加到系统中,那么为什么移动到C和Java?

    响应于你最近的编辑想利用处理速度的任何改进,那么你最好的办法是坚持C,因为它运行的硬件比C和Java有更高的运行时间。离硬件越近,运行速度越快。更高级的语言,例如C语言和Java语言会导致更快的开发时间…但是C或更好的汇编会导致更快的处理时间…但是更长的开发时间。


    我参加了几场Topcoder的马拉松比赛,比赛中的表现是取得胜利的关键。

    我的选择是C。我认为C的解决方案略微高于Java,并且比C++略微慢一些…直到有人在C++中编写了一个更快的数量级的代码。你需要使用英特尔编译器,而获胜代码中满是SIMD安装,你不能用C或Java复制它。但是如果SIMD不是一个选项,只要你小心地正确使用内存(例如,注意缓存错误,并试图限制内存访问L2高速缓存的大小),C语言和Java就应该足够好了。


    您的问题措辞很差(或者至少标题是),因为它意味着这种差异是特有的,对于Java/Cy/C代码的所有实例都是正确的。

    谢天谢地,这个问题的主体措辞更好,因为它提供了一个对代码所做事情的合理详细的解释。它不声明您使用的C版本/ Java运行时的版本(或提供程序)。它也没有说明运行代码的目标体系结构或机器。这些事情有很大的不同。

    你做了一些基准测试,这很好。关于您看到结果的原因的一些建议:

    • 你不擅长编写你在Java/C中的性能代码(这不是批评,甚至是可能的,但是你应该考虑的可能性)。
    • JVM的后期版本进行了一些严重的优化,以使非扩展锁非常快。这可能会偏向于您(尤其是与您正在使用的C实现线程原语进行比较)。
    • 由于Java代码与C代码相比运行良好,因此您可能不太依赖堆分配策略(剖析将告诉您这一点)。
    • 因为C代码比Java代码运行得好(假设代码是可比较的),那么存在几个可能的原因:
      • 您使用的是(不必要的)虚拟函数,JVM将内联这些函数,而CLR将不会
      • 最新的JVM确实进行了转义分析,这可能会使某些代码路径更加高效(尤其是那些涉及到生存期受堆栈限制的字符串操作的代码路径)。
      • 只有最新的32位CLR才会内联涉及非基元结构的方法
      • 一些JVM JIT编译器使用热点样式的机制,这些机制试图检测代码的"热点",并花费更多的精力重新对它们进行抖动。

    如果不了解代码的大部分时间都在做什么,就不可能给出具体的建议。我可以很容易地编写在clr下性能更好的代码,因为在对象上使用了结构,或者通过瞄准clr的特定于运行时的特性(如非装箱的泛型),这对于一般语句来说几乎没有指导意义。


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


    需要注意的一点是,如果您的应用程序能够受益于懒惰的评估,那么像Haskell这样的函数式编程语言可能会通过不评估不必要的分支而产生与实际优化的结构化/oo代码完全不同的加速。

    此外,如果您谈论的是更好的性能带来的经济效益,不要忘记将维护软件的成本添加到等式中。


    要重申一条评论,如果你在做算术科学计算,你应该使用GPU,而不是CPU。如果Matlab许可不是一个问题,Matlab与CUDA插件相比将比Java或C语言更强大。NVIDIA文档显示如何将任何CUDA函数编译为MEX文件。如果你需要免费的软件,我喜欢pycuda。

    但是,如果GPU不是一个选项,我个人喜欢C用于许多例程,因为编译器所做的优化没有JIT那么复杂:您不必担心"类"是否变成"结构"。根据我的经验,问题通常可以被分解,这样更高层次的东西可以用一种非常有表现力的语言来写,比如python(丰富的原语、动态类型、难以置信的灵活反射),转换可以用类似c的语言来写。此外,还有一些简洁的编译器软件,比如pluto(自动循环并行化)ON和OpenMP代码生成,以及库,如Hoad、TcMaloc、BLAS(GPU的CUBLAS)等,如果您选择走C/C++路由。


    取决于你在写什么样的申请。尝试计算机语言基准游戏

    http://shootout.alioth.debian.org/u32q/benchmark.php?测试= ALL&AMLAN= CCHARP和Lang2= Java&BOX=1http://shootout.alioth.debian.org/u64/benchmark.php?测试= ALL&AMLAN= CCHARP和Lang2= Java&BOX=1


    用一种或另一种语言写作只会使你在大量工作中获得很小的提速。要真正加快速度,您可能需要查看以下内容:

  • 购买最新最快的硬件。
  • 从32位操作系统移动到64位。
  • 网格计算。
  • CUDA/OpenCL。
  • 使用编译器优化,如矢量化。

  • 当然,答案是去购买最新的个人电脑,拥有你能负担得起的最核心/处理器。如果你买了一台最新的2X4核心PC,你会发现它的核心是四核的两倍,而且它们的运行速度比上一代处理器/机器快25-40%。

    这将使您的速度提高大约150%。远不止选择Java/C或C或C。而且,如果你继续买新的盒子,每18个月你就会得到同样的东西!

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

    提高代码质量/效率是很好的,但有时在其他地方更好地花费实现成本。


    我的首选是C或C++,因为JIT编译器没有与机器语言分离。

    您希望进行严格的性能调优,这意味着一次只需执行一条指令,就可以了解它在执行什么操作,然后调整源代码,以生成最佳的汇编程序。

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

    如果我站在你的立场上(或曾经站在你的立场上),我不会做的是依赖于一种语言比另一种语言更快或更慢的轶事概括。我要做的是沿着这条线、这条线和这条线进行多次激烈的性能调优。我做过很多次这样的事情,关键是重复诊断和修复的循环,因为每一个固定的段塞都会使剩下的段塞更加明显,直到你无法从萝卜中挤出另一个循环。

    祝你好运。

    补充:是否存在一些很少更改的配置信息来决定如何处理大量数据?如果是这样的话,可能是程序花费了大量时间重新解释配置信息,以确定下一步要做什么。如果是这样的话,那么编写一个代码生成器,它将读取配置信息并生成一个可以快速浏览数据而不必经常弄清楚要做什么的特别程序,通常是一个巨大的胜利。


    我会和C(或Java)一起去,因为你的开发时间可能会比C.快很多,如果你最终需要额外的速度,那么你就可以重写C中的一个部分,并把它称为模块。


    取决于你的基准和硬件。我认为这是速度而不是内存或CPU使用率,但是……

    如果你有一个专用的机器,只有一个非常大的内存量的应用程序,那么Java可能会更快5%。

    如果你在现实世界中的内存有限,在同一台机器上运行更多的应用程序,那么.NET在利用计算资源方面会做得更好:请看这里

    如果硬件是非常受限的,C/C++则是轻而易举的。


    如果每一个百分比真的能为你节省数万美元,那么你应该找一个领域专家来帮助这个项目。在初始阶段考虑性能良好的设计和编写的代码可能快了一个数量级,节省了90%或90万美元。我最近在一些代码中发现了一个微妙的缺陷,它将进程加速了100倍以上。我的一个同事发现了一个在O(n^3)中运行的算法,他重新编写了该算法,使其成为O(n log n)。这往往是节省大量性能的地方。

    如果问题如此简单以至于你确信一个更好的算法不能被使用给你显著的节省,那么C很可能是你最好的语言。


    如果你的大部分代码都是C语言,为什么不保留它呢?从原理上和设计上看,显然C更快。随着时间的推移,他们可能会缩小差距,但他们总是有更高的间接性和"安全性"。C很快,因为它是"不安全的"。只需考虑绑定检查。每个语言都支持与C的接口。所以我不明白为什么人们不想在C代码仍然有效的情况下就把它包装起来,用你喜欢的任何语言来使用它


    如果您使用的是一个高度多线程的代码,我建议您查看即将到来的.NET任务并行库(TPL)和本地C++应用程序的并行模式库(PPL)。这将为您节省大量线程/死锁问题以及您将花费大量时间为自己挖掘和解决的所有其他问题。就我自己而言,我真的相信,在管理世界中,内存管理的效率将更高,而且从长远来看,它将击败本地代码。


    最重要的事情已经在这里说了。我补充说:

    开发人员使用编译器使用的语言来生成机器指令,处理器使用这些指令来使用系统资源。当链的所有部分都以最佳方式运行时,程序将是"快速"的。

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

    • 用你最能控制的语言
    • 能够充分地指示编译器
    • 生成几乎最优的机器代码,以便
    • 目标机上的处理器能够优化利用处理资源。

    如果您不是性能专家,您将很难在任何语言中实现"峰值性能"。可能C++仍然提供了控制机器指令(特别是SSE扩展A.S.O)的最大选项。

    我建议以众所周知的80:20规则为导向。这对所有人都是相当正确的:硬件、语言/平台和开发人员的工作。

    由于升级到更快的处理器F.E.,开发人员一直依靠硬件自动修复所有性能问题。过去可能起作用的东西在最近的将来不会起作用。开发人员现在有责任为并行执行构建相应的程序。虚拟机和虚拟运行时环境的语言将在这里显示出一些优势。即使没有大规模的并行化,也几乎没有理由不认为C++或Java不能像C++一样成功。

    @编辑:看看C,matlab和fortran的比较,fortran不是单独赢的!


    我会考虑其他人使用什么——不是这个网站上的人,而是编写相同类型的大规模并行或超高性能应用程序的人。

    我发现他们都用C/C++编写代码。因此,仅针对这个事实(不管语言之间的任何速度问题),我都会用C/C++来进行。如果你用同一种语言写作,他们使用和开发的工具对你会更有用处。

    除此之外,我发现C应用在某些领域的性能比最佳性能差,多线程是其中之一。.NET将尽力保护您不受线程问题的影响(在大多数情况下可能是一件好事),但这将导致特定的情况问题(测试:尝试编写一个简单的循环,该循环使用大量线程访问共享对象)。在一台单核PC上运行它,你会比在多核盒子上运行它获得更好的性能。.NET正在添加自己的锁以确保你不会弄脏它(我使用了Jon Skeet的单核基准测试)。静态锁定在我的旧笔记本电脑上用了1.5秒,在我的超高速桌面上用了8.5秒,锁定版本更糟,你自己试试看)

    下一个要点是,用C你倾向于直接访问内存和数据——没有任何东西妨碍你,用C/J/Java你将使用一些所提供的许多类。在一般情况下,这些都是很好的,但是你追求的是最好的、最有效的访问方法(对于你的情况来说,这是一个涉及多兆字节数据的大问题,这些类的设计并没有考虑到这些数据集,它们是为其他人使用的常见情况而设计的),因此,同样地,使用C会更安全-你永远不会让gc被一个在内部创建新字符串的类阻塞,当您读取几兆字节的数据时,如果您用c编写它!

    因此,看起来C/Y/JAVA可以在本地应用程序上给您带来好处,但我想您会发现这些好处只对通常编写的业务应用程序实现。


    请注意,对于繁重的计算,有一个很大的优势,即具有紧密的循环,可以适合CPU的一级缓存,因为它避免了重复进入较慢的内存以获取指令。

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

    对于这些紧密的循环,C最有可能是最好的,因为您对生成的机器代码拥有最大的控制权,但是对于其他任何事情,您都应该使用具有最佳库的平台来完成您需要完成的特定任务。例如,netlib库在处理一系列非常大的问题时具有非常好的性能,并且有许多到其他语言的端口可用。


    "我的基准到目前为止显示Java和C是彼此相当的"。好的。

    那么你的基准有严重的缺陷…好的。

    除非你做了一些严重的错误,否则C总是会比C和Java更快。好的。

    PS!请注意,这不是试图欺负既不C也不Java,我喜欢Java和C.*,还有其他的原因,为什么你会选择许多问题,无论是Java或C语言,而不是C,但无论是Java或C在一个正确的书面测试永远不能执行与C.相同的速度。好的。

    因为大量的评论反对我的言论而编辑好的。

    比较这两个家伙…好的。

    C.*好的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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)好的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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周期…好的。

    此外,C版本将立即成为x86代码(在x86 CPU上),而C版本将首先成为IL代码。稍后执行时,它将必须进行JIT编译,这可能仅需要几个数量级的时间,然后只执行C版本。好的。

    现在一些聪明的人可能会执行上述代码并测量CPU周期。然而,这基本上根本没有意义,因为从数学上证明了托管版本可能需要几百万倍的CPU周期数作为C版本。所以我的猜测是,在这个例子中,我们现在讨论的是5-8个数量级。当然,这是一个"作弊测试",因为我"寻找一些东西来证明我的观点",但是我对那些在本文中对我评价很差的人提出质疑,要创建一个在C中执行速度不快,而且由于存在"更好的选择",它也不使用通常在C中不会使用的构造。好的。

    注意C语言和Java语言是很好的语言。我一天中的任何时候都比C更喜欢它们。但不是因为它们更快。因为他们不是。它们总是比C和C++慢。除非你用C或C++编码蒙上眼睛…好的。

    编辑;好的。

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

    即使我们对C版本进行了这样的优化,我们最终还是会得到比C版本慢几个数量级的东西……好的。

    一个好的C代码块总是比C语言、Java、Python和你选择的任何管理语言更快。好的。

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

    C和Java都比C和C的速度慢得多。好的。好啊。