c# - 对于小型密集型任务,C# 的性能与 C++ 的性能有多接近?

标签 c# c++ performance unsafe

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

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

因此,如果您要用两种语言编写一个简单的控制台应用程序,无限次地抛一枚假想的硬币,并每 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 以获得奖励?不那么主观,我可以通过这样做更快地完成密集操作吗?

最佳答案

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

Does C# have a performance boost from using unsafe code?

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

Would the program above be faster in C++ or negligably different?

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

Is it worth compiling long intensive number-crunching tasks in a language such as C++ or using /unsafe for a bonus? Less subjectively, could I complete an intensive operation faster by doing this?

这取决于项目...

关于c# - 对于小型密集型任务,C# 的性能与 C++ 的性能有多接近?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2674625/

相关文章:

c++ - C4250 VC++ 警告是什么意思?

mysql - 创建辅助表以提高大型 MySQL 表的性能?

c# - UI 线程中 Task.Wait 的替代方法

c# - 创建一个连接(对象)池——有什么库可以使用吗?

c++ - 参数列表中的元组

C++ 11 : Mutex & Condition Variable Cannot be Copied

database - 启动具有许多交互的社交应用程序时要避免的代码和服务器陷阱?

c - 多线程 C 速度并不快

c# - 输入验证 Silverlight

c# - Entity Framework 6 从同一个实体对象创建两个表