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

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

到目前为止,我的基准测试显示Java和C相互之间的差距很大,而.NET / C#的速度约为5% – 但我的一些同事声称,如果有足够的时间,那么具有正确优化的.NET将会击败这两者让JIT做它的工作。

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

任何人都可以对这种情况有所了解吗? .NET会击败Java吗? (或者我最好在这一点上坚持使用C?)。

代码是高度multithreading的,数据集的大小是几TB。

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

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

问题中的关键信息是:

每减少一个百分比我们的处理时间每年可节省数万美元

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

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

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

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

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

当我注意到代码的引用是“multithreading”时更新

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

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

这也取决于你是如何做到的 – 锁定策略, 如何进行并行化,主代码体等。

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

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

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

不要担心语言; 并行!

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

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

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

  1. MapReduce的
    您的问题听起来像Hadoop之类的很好的匹配, Hadoop专为数据密集型工作而设计。

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

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

老实说,我对这些基准感到惊讶。

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

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

此外,如果你正在处理数TB的数据,我的意见是你用C得到的确定性内存分配会好得多。如果你大致接近分配你的堆,那么你将大部分未分段。 使用GC环境,您可能会在运行时间长于预期后使用更多内存来完成您的程序,这仅仅是因为碎片化。

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

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

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


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

  • 陈第1部分
  • 玛丽安尼第1部分
  • 检查最后部分
  • 玛丽安尼最后一部分

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

它将在很大程度上取决于你具体做什么。 我有Java代码胜过C代码。 我的Java代码比C ++代码要慢得多(我不做C#/ .NET,所以不能说那些)。

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

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

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

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

优化就是发现和消除瓶颈。

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

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

您需要考虑两种情况:

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

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

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

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

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

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

因此,总而言之,在节省资金方面,它比你要选择的语言要多得多。

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

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

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

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

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

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

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

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

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

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

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

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

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

如果不了解您的代码花费大部分时间在做什么,就不可能提出具体的建议。 我可以非常轻松地编写在CLR下执行得更好的代码,因为在对象上使用了结构体,或者像非盒装generics一样针对CLR的运行时特定function,这作为一般性陈述几乎没有用处。

当然答案是购买最新的PC,你可以买得起的核心/处理器最多。 如果您购买最新的2×4核心PC之一,您会发现它不仅拥有四核的两倍核心,而且它们的运行速度比上一代处理器/机器快25-40%。

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

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

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

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

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

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

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

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

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

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

祝你好运。

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

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

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

如果你在现实世界中进入内存有限且在同一台机器上运行更多应用程序.net在利用计算资源方面看起来更好: 请参阅此处

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

如果您使用的是高度multithreading的代码,我建议您查看即将推出的.NET任务并行库(TPL)和本机C ++应用程序的并行模式库(PPL) 。 这将为您节省很multithreading/死锁的问题以及您将花费大量时间进行自我解决的所有其他问题。 就我自己而言,我确信管理世界中的内存管理将更有效,并且长期打败本机代码。

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

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

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

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

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

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

请注意,对于繁重的计算,具有可以适合CPU的第一级缓存的紧密循环是非常有利的,因为它避免了必须反复使用较慢的内存来获取指令。

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

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

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

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

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

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

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

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

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

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

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

@Edit:看看C#,Matlab和FORTRAN的比较 ,其中FORTRAN并不单独获胜!

参考值; “ 到目前为止,我的基准测试表明Java和C相互之间的水平相当

那你的基准就严重缺陷……

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

PS! 请注意,这不是试图欺负C#和Java,我同时喜欢Java和C#,并且还有其他原因可以解决许多问题选择Java或C#而不是C.但Java和C#都不会正确的书面测试永远不能以与C相同的速度执行…

编辑,因为大量的评论反对我的言论

比较这两个buggers ……

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周期......

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

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

请注意,C#和Java是GREAT语言。 我喜欢他们超过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 ++也是如此......