C ++比C#快多少?
还是现在相反?
据我所知,在某些方面,Cproves的速度比C ++快,但我从来没有胆量亲自测试它。
以为你们中的任何人都可以详细解释这些差异,或者将我指向正确的位置以获取有关此信息。
解决方案
快了五个橙子。或者更确切地说:不可能有(正确的)一揽子答案。 C ++是静态编译的语言(但随后,也进行了配置文件引导的优化),Cruns在JIT编译器的帮助下进行了开发。差异如此之多,以至于甚至无法给出数量级的问题,都无法回答诸如快得多的问题。
没有严格的理由说明为什么具有JIT的基于字节码的语言(如Cor Java)不能与C ++代码一样快。但是,C ++代码在很长一段时间内过去一直明显更快,并且在许多情况下今天仍然如此。这主要是因为实施更高级的JIT优化非常复杂,而真正酷的优化才刚刚出现。
因此,在许多情况下,C ++速度更快。但这只是答案的一部分。 C ++实际上更快的情况是高度优化的程序,专家程序员在其中彻底地从代码中优化了地狱。这不仅非常耗时(并因此很昂贵),而且通常还会由于过度优化而导致错误。
另一方面,在更高版本的运行时版本(.NET CLR或者Java VM)中,解释型语言的代码变得更快,而无需执行任何操作。而且,JIT编译器可以进行很多有用的优化,而这些优化在带有指针的语言中是根本不可能实现的。另外,有人认为垃圾回收通常应与手动内存管理一样快或者更快,在许多情况下也是如此。通常,我们可以用C ++或者C来实现并实现所有这些功能,但是它将变得更加复杂且容易出错。
正如Donald Knuth所说:"过早的优化是万恶之源"。如果我们确实确定应用程序将主要由对性能至关重要的算法组成,并且将成为瓶颈,并且在C ++中肯定会更快,并且我们可以确定C ++不会与其他应用程序冲突要求,请使用C ++。在任何其他情况下,首先要专注于首先以最适合自己的语言正确实现应用程序,然后在运行速度太慢时发现性能瓶颈,然后考虑如何优化代码。在最坏的情况下,我们可能需要通过外部函数接口调出C代码,因此我们仍然可以用较低级的语言编写关键部分。
请记住,优化正确的程序相对容易,但是校正优化的程序要困难得多。
不可能给出实际的速度优势百分比,这在很大程度上取决于代码。在许多情况下,编程语言的实现甚至不是瓶颈。出于极大怀疑,请访问http://benchmarksgame.alioth.debian.org/上的基准测试,因为这些测试代码主要是对算术代码的测试,很可能与代码根本不相似。
像往常一样,这取决于应用程序。在某些情况下,Cis的速度可能会忽略不计,而在其他情况下,C ++的速度会提高5或者10倍,尤其是在可以轻松进行SIMD操作的情况下。
C可能不会更快,但是它会使YOU / ME更快。这是我所做的最重要的衡量。 :)
当可以在编译时预先确定多态决策时,就会发生C ++仍占上风(并且将持续数年)的一种特殊情况。
通常,封装和延迟决策是一件好事,因为它使代码更具动态性,更易于适应不断变化的需求并且更易于用作框架。这就是为什么在Cis中面向对象的编程非常有生产力,并且可以在术语"泛化"下进行泛化的原因。不幸的是,这种特殊的归纳是在运行时付出代价的。
通常,此成本不算什么,但是在某些应用程序中,虚拟方法调用和对象创建的开销可能有所不同(尤其是因为虚拟方法阻止了其他优化,例如方法调用内联)。这是C ++的巨大优势,因为我们可以使用模板来实现另一种类型的泛化,这对运行时没有影响,但不一定比OOP的多态性小。实际上,仅使用模板技术和编译时分辨率就可以对构成OOP的所有机制进行建模。
在这种情况下(当然,它们通常仅限于特殊问题领域),C ++胜过Cand可比语言。
C ++(或者C)可以使我们对数据结构进行细粒度的控制。如果我们想旋转一下,则可以选择该选项。使用Java / .NET库的内部数据结构的大型托管Java或者.NET应用程序(OWB,VisualStudio2005)随身携带了行李。我已经看到OWB设计者会议使用了超过400MB的RAM和BIDS进行多维数据集或者ETL设计,同时也占用了100兆的MB。
在可预测的工作负载(例如大多数基准多次重复一个过程)上,JIT可以为我们提供经过充分优化的代码,以至于没有实际差异。
IMO在大型应用程序上的区别不仅在于JIT,还在于代码本身正在使用的数据结构。如果应用程序占用大量内存,则缓存使用率将降低。现代CPU上的高速缓存未命中是相当昂贵的。 C或者C ++真正取胜的地方是,我们可以优化数据结构的使用,以更好地与CPU缓存配合使用。
没有真正确定的答案,这是一个非常模糊的问题。
例如;我宁愿玩用C ++创建的3D游戏,也不愿玩C#,因为它的性能肯定要好得多。 (而且我知道XNA等,但是它离真实的东西还差得远)。
另一方面,如前所述;我们应该使用一种可以快速完成所需工作的语言进行开发,然后在必要时进行优化。
以我的经验(我在这两种语言上都有很多工作),与C ++相比,C的主要问题是高内存消耗,而且我还没有找到控制它的好方法。最终将使.NET软件变慢的是内存消耗。
另一个因素是JIT编译器不能花太多时间进行高级优化,因为它在运行时运行,如果花费太多时间,最终用户会注意到它。另一方面,C ++编译器始终需要在编译时进行优化。这个因素远不及内存消耗恕我直言。
我知道这不是我们要的内容,但是Cis的编写速度通常比C ++快,这在商业环境中是一个很大的好处。
我想有些应用程序是用Crunning快速编写的,还有更多的C ++编写的应用程序运行得很快(好一点的C ++以及UNIX也是如此……)
问题确实是那件事,用户和开发人员都在抱怨...
好吧,恕我直言,就Cwe而言,它具有非常舒适的UI,非常好的库层次结构以及CLI的整个界面系统。对于C ++,我们有模板,ATL,COM,MFC以及已经编写并正在运行的代码(如OpenGL,DirectX等)的全部代码。开发人员抱怨在C(意味着程序运行速度很快,并且一秒钟的爆炸声!它被卡住了)。
用Cvery轻松快速地编写代码(不要忘记这也会增加出错的机会。
如果使用C ++,开发人员会抱怨内存泄漏,压缩,DLL之间的调用以及更新和支持库的" DLL地狱"问题。
我认为我们在编程语言中拥有的技能越多,软件的质量(和速度)就越高。
从我所听到的...
困难似乎在于确定我们所听到的内容是否可信,并且当我们尝试评估此站点上的答复时,只会再次遇到该困难。
我们将如何确定人们在这里所说的话是否比我们最初听到的话可信或者更强?
一种方法是索取证据。
当有人声称"某些地方Cproves的速度比C ++快"时,问他们为什么这样说,请他们向我们展示测量结果,请他们向我们展示程序。有时他们只会犯错。有时我们会发现他们只是表达一种观点,而不是分享他们可以证明是真实的东西。
- "出于极大的怀疑,在http://shootout.alioth.debian.org/上使用基准测试,因为这些测试代码主要是对算术代码的测试,很可能与代码根本不相似。"问问自己是否真的了解"这些经过大量测试的算术代码"的含义,然后问问自己作者是否真的向我们表明他的主张是正确的。
- "这是一个非常无用的测试,因为它实际上取决于各个程序的优化程度;我设法将其中一些程序的速度提高了4-6倍甚至更多,这很清楚地表明,未优化程序之间的比较相当愚蠢的。"问问自己,作者是否真的向我们表明他已经设法"将其中的一些速度提高了4-6倍或者更多"-这很容易做到!
人们通常会在信息和意见中混淆人们所声称的内容,而我们必须尝试找出哪个是哪一个。例如,从此论坛中的答复:
对于图形,标准CGraphics类比通过C / C ++访问的GDI慢得多。
我知道这与语言本身无关,与整个.NET平台无关,但是Graphics是作为GDI替代品提供给开发人员的,它的性能太差了,我什至都不敢做图形用它。
我们有一个简单的基准,用于查看图形库的速度,即在窗口中绘制随机线。 C ++ / GDI仍能轻松处理10000行,而C#/ Graphics难以实时执行1000行。
毕竟答案必须在某个地方,不是吗? :)
嗯不
- 这个问题使语言与语言实现混为一谈-这个C程序比该C#程序慢2194倍,快1.17倍-我们将不得不问你:哪种语言实现?
正如一些答复所指出的那样,问题的指定方式不够明确,无法以答案的方式邀请问题。仅采取一种方式:
然后哪个程序?哪台机器?哪个操作系统?哪个数据集?
从理论上讲,对于长时间运行的服务器类型应用程序,JIT编译的语言比本地编译的语言要快得多。由于通常首先将JIT编译语言编译为相当低级的中间语言,因此无论如何,我们都可以在编译时立即进行许多高级优化。最大的优势在于,随着JIT可以获取越来越多的有关应用程序使用方式的数据,它可以继续动态地重新编译部分代码。它可以安排最常见的代码路径,以使分支预测尽可能频繁地获得成功。它可以重新排列通常一起调用的单独代码块,以将它们都保留在缓存中。它可以花费更多的精力来优化内部循环。
我怀疑这是通过.NET或者任何JRE完成的,但是在我上大学时就已经对其进行了研究,因此可以认为这些事情很快就会进入现实世界并不无道理。
- GC何时会发生?
- 需要花多长时间?
垃圾回收是JavaCANNOT不能用于实时系统的主要原因。
这是不确定的。
需要大量内存访问的应用程序,例如。通常,在非托管环境(C ++)中编写图像操作要比托管(C#)更好。使用指针算法优化的内部循环更容易在C ++中进行控制。在C中,我们可能需要求助于不安全的代码才能获得接近相同的性能。
我们必须确定Cwa在性能上是否可与C ++相提并论,为此我编写了一些测试程序(两种语言均使用Visual Studio 2005)。事实证明,没有垃圾回收,仅考虑语言(而不是框架),Chas的性能基本上与C ++相同。在C中,内存分配比在C ++中要快得多,并且当数据大小增加到超出缓存行边界时,在确定性方面略有优势。但是,所有这些最终都需要付费,而且由于垃圾回收,Cdue的性能不确定,因此付出了巨大的代价。
对于"令人尴尬的并行"问题,当在C ++上使用Intel TBB和OpenMP时,与Cand TPL进行的类似(纯数学)问题相比,我发现性能提高了大约10倍。 SIMD是Ccan无法竞争的领域,但我也给人留下了TPL具有相当大的开销的印象。
就是说,我只将C ++用于对性能至关重要的任务,因为我知道我将能够使用多线程并快速获得结果。对于其他所有内容,C(以及偶尔的F#)都很好。
受此启发,我对大多数程序中所需的60%的普通指令进行了快速测试。
for (int i=0; i<1000; i++) { StreamReader str = new StreamReader("file.csv"); StreamWriter stw = new StreamWriter("examp.csv"); string strL = ""; while((strL = str.ReadLine()) != null) { ArrayList al = new ArrayList(); string[] strline = strL.Split(','); al.AddRange(strline); foreach(string str1 in strline) { stw.Write(str1 + ","); } stw.Write("\n"); } str.Close(); stw.Close(); }
继承人的Ccode:
字符串数组和arraylist专门用于包含这些指令。
for (int i = 0; i<1000; i++) { std::fstream file("file.csv", ios::in); if (!file.is_open()) { std::cout << "File not found!\n"; return 1; } ofstream myfile; myfile.open ("example.txt"); std::string csvLine; while (std::getline(file, csvLine)) { std::istringstream csvStream(csvLine); std::vector csvColumn; std::string csvElement; while( std::getline(csvStream, csvElement, ‘,’) ) { csvColumn.push_back(csvElement); } for (std::vector::iterator j = csvColumn.begin(); j != csvColumn.end(); ++j) { myfile << *j << ", "; } csvColumn.clear(); csvElement.clear(); csvLine.clear(); myfile << "\n"; } myfile.close(); file.close(); }
这是c ++代码:
我使用的输入文件大小为40KB。
- C ++代码运行了9秒钟。
- C#代码:4秒!!!
结果是-
哦,但这是在Linux上...在Crunning上运行Mono ...以及C ++和g ++。
- C#代码运行了9秒钟。
- C ++代码可怕的370秒!!!
好的,这是我在Windows VisualStudio2003上得到的:
.NET语言可以与C ++代码一样快,甚至更快,但是C ++代码将具有更恒定的吞吐量,因为.NET运行时必须暂停GC,即使暂停非常聪明。
因此,即使我们对运行时GC非常小心,如果我们有一些必须始终快速运行且没有任何暂停的代码,.NET有时会引入延迟。
这得看情况。如果字节码被翻译成机器码(而不仅仅是JIT)(我是说如果我们执行该程序),并且程序使用了许多分配/取消分配,那么它可能会更快,因为GC算法只需要一次通过(理论上)通过整个内存一次,但是普通的malloc / realloc / free C / C ++调用会导致每个调用产生开销(调用开销,数据结构开销,缓存未命中;))。
因此,从理论上讲是可能的(对于其他GC语言也是如此)。
我真的没有看到不能针对大多数应用程序对C使用元编程的极端缺点,因为大多数程序员无论如何都不会使用它。
段落数量不匹配