我在考虑 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 来获得奖励?不那么主观,我可以通过这样做更快地完成一个密集的操作吗?