我在考虑 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/