C#与C++性能比较

4

可能是重复问题:
C++比C#快多少?

你好!

在实际使用中,是否有任何情况下C#比C++更快(具有更好的性能)?

我听说泛型集合比STL具有显着的性能优势,这是真的吗?

在C#中编写的本机代码(不安全块、固定指针、Marshal等)与在C++中编写的相同代码具有相同的性能吗?


3
重复问题:C++比C#快多少?请参阅:C++性能 vs. Java/C#. 还有许多类似的问题,但大多数倾向于专注于特定算法或问题类型。如果您有特定问题(例如Collections.Generic.Liststd::vector()的插入性能),请具体提问。 - Shog9
4个回答

6
有时候C#在实际使用中比C++更快(性能更好)。使用不安全块、固定指针、Marshal等方式编写的本地代码在性能上是否与用C++编写的本地代码相同?
是的,有时候会发生这种情况。请参阅此处的答案:为什么我使用本机代码可以看到约20%的速度提高? 听说泛型集合比STL具有显着的性能优势,这是真的吗?
不一定。STL可以非常高效-通常比.NET中的泛型集合更高效。
然而,总的来说,我不会在这个层面上专注于性能。如果您正确开发,C#和C++都足够快。您可以在任何一种语言中编写非常高效的代码-同样容易地,您也可以让任何一种语言的代码表现得非常糟糕。

4
+1 是为“同样地,你可以编写在任何一种语言中表现非常糟糕的代码”所做出的认可。 - Thorin
“STL可以非常高效”,但这并不是我的经验。 - J D
在C#中,使用List<T>集合中的整数索引或foreach块比使用STL迭代器更慢。 - Dan Randolph
@DanRandolph 只有在没有启用优化的情况下编译时才会出现。即使在现代编译器上启用了低优化,C++标准库迭代器也没有任何开销(事实上,它们是如此透明,以至于编译器对循环代码执行疯狂的转换,例如向量化)。最好的情况是,你只能希望.NET与它们的性能相匹配。它不可能超越它们。 - Konrad Rudolph

5

我听说泛型集合比STL具有显著的性能优势,这是真的吗?

我非常怀疑这一点,STL使用模板,可以避免JIT开销,并且仍然创建真正的、编译过的、静态类型的集合。

用C#编写的本地代码(不安全块、固定指针、Marshal等)与使用C++编写的相同代码具有相同的性能吗?

虽然C#不安全代码执行得非常好,但它与其他运行时部分的连接并不很好...例如,尝试使用不安全缓冲区进行套接字代码,你只会到处使用fixed块,最终会变成噩梦。不仅如此,C++代码仍然表现更佳。

C#在实际应用中是否存在比C++更快(性能更好)的情况?

动态代码是我想到的最大的一个例子,System.Reflection.Emit和Linq表达式(特别是在C# 4.0中的新功能)使得在C#中生成代码变得实用,而在C++中使用类似的策略可能需要更多的努力(因此不实用)。


3
在一个大型应用程序中,STL 可能会更慢,因为它实例化了无数不同版本的模板代码,这可能导致缓存问题。不过我没有数据来支持这个理论! - Oliver Charlesworth
非常正确,尽管我认为大多数本地编译器非常擅长提取各种实例共有的代码部分。 - LorenVS
这是一个相当主观的答案 - 我想看到一些证据支持这些说法(即使它们“听起来”可行)。 - Jeff Yates
@Oli:一种常见的情况是,一些人在使用STL时会遇到性能问题,而使用.NET集合则不会,这是因为存储大对象时,STL在插入和调整大小时需要复制它们,而托管集合仅存储和复制引用。当然,你可以在C++中使用指针,并且大多数情况下都能获得相同的优势,只要你小心地将某些东西的内存管理责任交给其他部分即可。 - Shog9
此外,对于任何值类型(在高性能C#中广泛使用),当JIT使用特定类型实例化模板时,它会生成完全不同的代码。 - LorenVS
值得一提的是:有一段时间为C++/CLR实现了STL。性能非常糟糕-虽然在纯C++中许多操作被内联,但在托管代码中却不会...这种组合开销可能会压垮系统。 - Shog9

2

我发现在一个需要频繁分配/释放不同大小对象的应用程序中,使用C#相比于C++有一定的性能提升。我猜测垃圾回收是这样工作的好工具。

然而,至少在C#/.NET 2.0中,对于处理数字数组,C++代码明显更快(因为c# 2.0没有SSE支持)。


1
据我所了解,.NET 并不支持使用 C# 编写本机代码。即使是不安全的代码也是受管理的,只是它可以更多地访问系统资源,因此在完成后需要更多的清理工作。

本地代码是非托管的,此外您可以从C#调用非托管DLL。 - Przemysław Michalski
3
我没有说原生代码是托管的。 - PVitt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接