繁体   English   中英

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

[英]Compile C#, so that it runs with the speed of C++

好吧,所以我想问一下是否有可能将解析器从c#转换为c ++。
因此,用C#编写的代码将能够与用C ++编写的代码一样快地运行。
实际可行吗? 我不是问这将有多困难。

是什么让您认为将C#代码转换为C ++会神奇地使其速度更快?

语言没有速度。 假设C#代码的速度较慢(我会再讲),这是由于该代码的作用 (包括C#所隐含的要求,例如数组的边界检查),而不是因为它所编写的语言在。

如果将C#代码转换为C ++,它仍然需要对数组进行边界检查,因为原始源代码预期会发生这种情况,因此它必须做很多工作。

而且,C#通常并不比C ++慢。 互联网上有许多基准测试,通常表明C#在大多数情况下与C ++ 一样快 (或比C ++快)。 只有花费大量时间优化代码,C ++才会变得更快。

如果需要更快的代码,则需要编写需要较少工作来执行的代码,而不是尝试更改源语言。 那只是最糟糕的货运狂热编程。 您曾经看到过一些有效的代码,这些代码都是用C ++编写的,所以现在您尝试使C ++成为现实,以期吸引可能传递的任何效率。

就是那样行不通。

尽管您可以将C#代码转换为C ++,但是仍然存在一个问题,即C#依赖于非本机的.Net框架库,因此您不能简单地将C#代码转换为C ++。

更新资料

同样,C#代码依赖于运行时来执行诸如内存管理(即垃圾收集)之类的事情。 如果将C#代码转换为C ++,则内存管理代码在哪里? 解析和翻译不会解决这样的问题。

Mono项目在将LLVM转换为C#运行时的本机代码编译器上投入了大量精力,尽管特定语言结构(如共享泛型等)存在一些问题。 检查一下并旋转一下。

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

与性能相关的调整:

平台无关

  • 使用探查器发现瓶颈;

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

单声道

  • 使用Mono --gc=sgen --optimize=inline,... (SGEN垃圾收集器可以使数量级产生差异)。 另请参阅man mono了解许多调优/优化选项
  • 使用MONO_GENERIC_SHARING=none禁用共享泛型(使特定任务更快,尤其是在同时支持valuetype和reftype时)( 不建议用于常规生产
  • 使用-optimize+编译标志(独立于JITter可能执行的操作来优化CLR代码)

不太主流:

微软.NET

上面的大多数都具有直接的Microsoft挂件( NGen`/ Optimize等)。

当然,MS没有可切换/可调的垃圾收集器,而且我不认为像mono一样可以实现完全编译的本机二进制文件。

与往常一样,使代码运行更快的答案是:

找到瓶颈并进行优化

大多数情况下,瓶颈是:

在关键循环中花费时间
查看您的算法和数据结构,不要更改语言,后者将使速度提高10%,第一种将使您的速度提高1000倍。
如果您坚持使用最佳算法,则始终可以针对SO提出一个具体,简短而详细的问题。

等待资源缓慢的时间
减少您从源头请求的东西数量
代替:

SELECT * FROM bigtable 

SELECT TOP 10 * FROM bigtable ORDER BY xxx

后者将立即返回,并且您无论如何都无法以有意义的方式显示一百万条记录。
或者,您也可以让服务器在订单末尾减少数据,这样跨网络就不需要100年了。

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

花时间,因为您正在用千兆字节的数据溢出内存
使用不同的算法,一次处理较小的数据集。
尝试优化缓存使用率。

高效编码的答案是衡量编码时间的流向
使用探查器。
请参阅: http//csharp-source.net/open-source/profilers

并优化那些消耗CPU时间超过50%的部件。
进行多次迭代后,很快您的10小时运行时间将减少到可管理的3分钟,而不是从切换到该语言或更好的语言后的9.5小时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM