编译C#,使其以C ++的速度运行

时间:2011-08-25 09:17:25

标签: c# c++

好吧,所以我想问一下是否可以从c#到c ++创建一个解析器。
因此用C#编写的代码能够像用C ++编写的代码一样快速运行 它真的可以吗?我不是在问它会有多难。

6 个答案:

答案 0 :(得分:8)

是什么让你认为将C#代码翻译成C ++会神奇地让它更快?

语言没有速度。假设C#代码较慢(我会回到那里),这是因为所做的代码(包括C#提出的隐式要求,例如对数组进行边界检查),而不是因为它是用它编写的语言。

如果你将C#代码转换为C ++,那么仍然需要对数组进行边界检查,因为原始源代码预计会发生这种情况,所以它必须做同样多的工作

此外,C#通常不比C ++慢。互联网上有很多基准,通常表明C#与一样快(或者比C ++更快)。只有当您花费大量时间优化代码时,C ++才会变得更快。

如果您想要更快的代码,则需要编写需要较少工作量的代码,而不是尝试更改源语言。这只是最糟糕的货物狂热编程。你曾经看过一些有效的代码,而且是用C ++编写的,所以现在你尝试用C ++编写东西,希望能吸引任何可能传递的效率。

它只是不起作用。

答案 1 :(得分:3)

虽然你可以将C#代码翻译成C ++,但是会出现C#依赖于非本地的.Net框架库的问题,所以你不能简单地将C#代码翻译成C ++。

<强>更新

此外,C#代码依赖于运行时来执行诸如内存管理(即垃圾收集)之类的操作。如果您将C#代码翻译成C ++,那么内存管理代码将在哪里?解析和翻译不会解决这类问题。

答案 2 :(得分:2)

Mono项目在转​​向LLVM into a native machine code compiler for the C# runtime方面投入了大量精力,尽管shared generics etc.等特定语言结构存在一些问题。检查一下然后把它拿走。

答案 3 :(得分:1)

您可以使用NGen将IL编译为本机代码

答案 4 :(得分:0)

与绩效相关的调整:

独立于平台

  • 使用分析器发现瓶颈;

    • 防止不必要的垃圾(使用生成#0收集计数和大对象堆发现)
    • 防止不必要的复制(明智地使用struct)
    • 防止无根据的泛型(代码共享具有意外的性能副作用)
    • 当性能成为问题时,
    • 更喜欢老式循环而不是枚举器块
    • 在您维护/打破延期评估的地方密切使用LINQ手表时。两者都可以大大提升绩效
  • 使用reflection.emit / Expression Trees预编译某些性能瓶颈的动态逻辑

  • 使用Mono --gc=sgen --optimize=inline,...(SGEN垃圾收集器可以产生数量级差异)。另请参阅 man mono 了解大量优化/优化选项
  • 使用MONO_GENERIC_SHARING=none禁用泛型共享(特别是在支持valuetypes和reftypes时更快地完成特定任务)(不推荐用于常规生产
  • 使用-optimize+编译标志(独立于JITter可以对其进行优化的CLR代码)

不那么主流:

MS .NET

以上大多数都有直接的微软吊坠(NGen`/Optimize'等。)

当然MS没有可切换/可调的垃圾收集器,我认为不能像单声道那样实现完全编译的本机二进制文件。

答案 5 :(得分:0)

一如既往,让代码运行得更快的答案是:

找出瓶颈并优化

大部分时间瓶颈都是:

在关键循环中花费的时间
检查你的算法和数据结构,不要改变语言,后者将提供10%的加速,第一个会给你1000倍的加速。
如果你坚持使用最好的算法,你总是可以在SO上询问具体,简短和详细的问题。

等待慢源的资源的时间
减少您从来源请求的内容数量 而不是:

SELECT * FROM bigtable 

DO

SELECT TOP 10 * FROM bigtable ORDER BY xxx

后者将立即返回,无论如何您无法以有意义的方式显示一百万条记录 或者您可以让订单端的服务器减少数据,这样就不需要100年才能通过网络。

另外,您可以在单独的线程中执行慢速数据提取例程,因此您的程序的其余部分可以执行有意义的操作而不是等待。

时间花费,因为您的内存溢出了数GB的数据
使用不同的算法,一次处理较小的数据集 尝试优化缓存使用情况。

高效编码的答案是衡量编码时间的来源
使用分析器。
见:http://csharp-source.net/open-source/profilers

优化那些占用CPU时间50%以上的部分 这样做可以进行多次迭代,很快你的10小时运行时间将缩短到可管理的3分钟,而不是从切换到这种或更好的语言所得到的9.5小时。