C# 与 C++ 性能比较 [重复]

Posted

技术标签:

【中文标题】C# 与 C++ 性能比较 [重复]【英文标题】:C# vs C++ performance comparison [duplicate] 【发布时间】:2010-10-18 16:58:35 【问题描述】:

可能重复:How much faster is C++ than C#?

你好!

在实际使用中有没有 C# 比 C++ 更快(性能更好)的情况?

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

用 C# 编写的本机代码(不安全块、引脚指针、Marshal...)是否具有与用 C++ 本地编写的相同代码相同的性能?

【问题讨论】:

How much faster is C++ than C#? 的副本...另请参阅:C++ performance vs. Java/C#。还有许多其他类似的问题,但大多数倾向于关注特定的算法或问题类型 - 如果您有特定的想法(例如,Collections.Generic.Liststd::vector() 的插入性能),然后具体询问. 【参考方案1】:

在实际使用中有没有 C# 比 C++ 更快(性能更好)的情况?

用 C# 编写的本机代码(不安全块、引脚指针、Marshal...)是否与用 C++ 本机编写的相同代码具有相同的性能?

是的,有时会发生这种情况。在这里查看答案:

Why would I see ~20% speed increase using native code?

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

不一定。 STL 可以非常高效 - 通常比 .NET 中的通用集合更高效。

但是,总的来说,我不会关注此级别的性能。如果您正确地开发 C# 和 C++,它们都“足够快”。您可以用任何一种语言编写非常、非常高性能的代码 - 同样容易地,您可以用任何一种语言编写性能非常糟糕的代码。

【讨论】:

+1 表示“同样容易,您可以编写在任何一种语言中都表现得很糟糕的代码” “STL 可以非常高效”。那不是我的经历。 使用 STL 迭代器比在 List 集合中使用整数索引或在 C# 中使用 foreach.block 慢。 @DanRandolph 仅当您在没有优化的情况下进行编译。即使在现代编译器上启用了低优化,C++ 标准库迭代器也有开销(事实上,它们是如此透明,以至于编译器对循环代码执行疯狂的转换,例如向量化)。充其量,您只能希望 .NET 与它们的性能相匹配。不可能超过他们。【参考方案2】:

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

我非常怀疑,STL 使用模板,它绕过 JIT 开销,仍然创建真实的、编译的、静态类型的集合。

用 C# 编写的本机代码(不安全块、引脚指针、Marshal...)是否与用 C++ 本机编写的相同代码具有相同的性能?

虽然 C# 不安全代码执行得非常好,但它并不能很好地与运行时的其余部分联系起来……例如,尝试使用不安全缓冲区来编写套接字代码,结果你只是到处使用固定块,并且它变成了一场噩梦。不仅如此,C++ 代码的性能仍然会更好。

在实际使用中有没有 C# 比 C++ 更快(性能更好)的情况?

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

【讨论】:

可以想象,在大型应用程序中,STL 可能会更慢,因为它实例化了无数不同版本的模板代码,这可能会导致缓存问题。不过,我没有数据支持这个理论! 非常正确,尽管我认为大多数原生编译器都非常擅长提取各种实例化共有的代码部分。 这是一个相当主观的答案 - 我希望看到一些证据证明这些说法(即使它们“听起来”是可行的)。 @Oli:有些人会遇到 STL 性能问题而 .NET 集合不会遇到性能问题的一种常见情况是存储大型对象。 STL 将在插入和调整大小期间复制它们,而托管集合仅存储和复制引用。当然,您可以在 C++ 中使用指针并在大多数情况下获得相同的优势,只要您小心地让 something 负责管理内存。 此外,对于任何值类型(在高性能 C# 中到处都使用),JIT 在实例化具有特定类型的模板时会生成完全不同的代码【参考方案3】:

我使用 C# 而不是 C++ 对分配/取消分配许多小尺寸对象但大小不同的应用程序进行了一些性能改进。我怀疑垃圾收集是完成此类工作的好工具。

但是,至少在 C#/.NET 2.0 中,C++ 为处理数字数组生成了更快的代码(C# 2.0 不支持 SSE)。

【讨论】:

【参考方案4】:

据我了解.NET 你不能用 C# 编写本机代码。即使不安全的代码也被管理,它只是对系统资源有更多的访问权,因此有更多的责任在事后进行清理。

【讨论】:

原生代码是非托管的,除了你可以从 C# 调用非托管的 DLLs 我没说原生代码是托管的。

以上是关于C# 与 C++ 性能比较 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

性能提升:使用c#调用c++(核心代码优化)

这些与平台在性能上如何比较,即人员-wsf 和 wt?

C++买啥书比较好

C++ 与 Java/C# 比较

C++ 与 C# 数组性能问题

代理服务器的 C# 性能(与 C++ 相比)