4

我在考虑 C++ 与 C# 的速度差异主要是关于 C# 编译为由 JIT 编译器接收的字节码(正确吗?)以及 C# 所做的所有检查。

我注意到可以在编译选项中关闭很多这些功能,也可能通过使用unsafe关键字作为公共语言运行时无法验证的不安全代码。

因此,如果您要用两种语言编写一个简单的控制台应用程序,将想象中的硬币翻转无限次,然后每 10,000 次左右迭代将结果显示到屏幕上,速度会有多大差异?我选择这个是因为它是一个非常简单的程序。

我想对此进行测试,但我不知道 C++ 或没有编译它的工具。这是我的 C# 版本:

static void Main(string[] args)
{
    unsafe
    {
        Random rnd = new Random();
        int heads = 0, tails = 0;
        while (true)
        {
            if (rnd.NextDouble() > 0.5)
                heads++;
            else
                tails++;

            if ((heads + tails) % 1000000 == 0)
                Console.WriteLine("Heads: {0}  Tails:  {1}", heads, tails);
        }
    }
}

差异是否足以保证故意将代码段编译为“不安全”或编译成没有某些编译选项(如启用溢出检查)的 DLL?还是相反,在 C++ 中编译部分是有益的?我确信互操作速度也会发挥作用。

为避免主观性,我重申这个问题的具体部分:

  • C# 是否因使用不安全代码而提高了性能?
  • 诸如禁用溢出检查之类的编译选项是否会提高性能,它们是否会影响不安全的代码?
  • 上面的程序在 C++ 中会更快还是几乎可以忽略不计?
  • 是否值得用 C++ 等语言编译长时间密集的数字运算任务或使用 /unsafe 来获得奖励?不那么主观,我可以通过这样做更快地完成一个密集的操作吗?
4

2 回答 2

2

给出的示例是有缺陷的,因为它没有显示两种编程语言的实际用法。使用简单的数据类型来衡量语言的速度不会带来任何有趣的东西。相反,我建议您在 C++ 中创建一个模板类,并将其与 C# 中可能的类泛型进行比较。最后,对象会带来一些重要的结果,你会发现 C++ 比 C# 快。更不用说您正在将较低级别的编程语言与 C# 进行比较。

C# 是否因使用不安全代码而提高了性能?

是的,它会有所提升,但不建议您只编写不安全的代码。原因如下:使用不安全上下文编写的代码无法验证是否安全,因此只有在代码完全受信任时才会执行。换句话说,不安全的代码不能在不受信任的环境中执行。例如,您不能直接从 Internet 运行不安全的代码。http://msdn.microsoft.com/en-us/library/aa288474(VS.71).aspx

上面的程序在 C++ 中会更快还是几乎可以忽略不计?

是的,该程序在 C++ 中会稍微快一些。如果您开始使用算法库(想到 random_shuffle),C++ 是一种较低级的编程语言,甚至更快。

是否值得用 C++ 等语言编译长时间密集的数字运算任务或使用 /unsafe 来获得奖励?不那么主观,我可以通过这样做更快地完成一个密集的操作吗?

这取决于项目...

于 2010-04-20T11:48:22.200 回答
1

高达 100% 以上的速度——简单地说,很大程度上取决于任务。

超过 100% - 是的,因为即时编译器知道您的处理器,我怀疑您是否真的针对您的硬件平台进行了优化;)

如果您进行矩阵运算,则没有 SSE 问题。

对于一些有大量数组的事情(图像处理) 数组测试会杀了你,但是指针会工作(即不安全的代码),因为它们绕过了这个。

关于溢出检查之类的事情-要小心。如:在 C++ 中,你可能有同样的情况。如果您需要溢出检查,则性能问题不存在;)

在大多数情况下,我个人不会打扰 C++。部分是的,尤其是当您可以从 SSE 中受益时:

所以,如果你的计算,最后很大程度上取决于自然。

于 2010-04-20T11:34:25.903 回答