[英]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编译为本机代码
与性能相关的调整:
使用探查器发现瓶颈;
使用reflection.emit / Expression Trees预编译某些性能瓶颈的动态逻辑
Mono --gc=sgen --optimize=inline,...
(SGEN垃圾收集器可以使数量级产生差异)。 另请参阅man mono
了解许多调优/优化选项 MONO_GENERIC_SHARING=none
禁用共享泛型(使特定任务更快,尤其是在同时支持valuetype和reftype时)( 不建议用于常规生产 ) -optimize+
编译标志(独立于JITter可能执行的操作来优化CLR代码) 不太主流:
使用LLVM后端(单击引号:)
使用mkbundle创建静态链接的NATIVE二进制映像(已经完全JITted,即AOT( 提前编译))
上面的大多数都具有直接的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.