好吧,所以我想问一下是否可以从c#到c ++创建一个解析器。
因此用C#编写的代码能够像用C ++编写的代码一样快速运行
它真的可以吗?我不是在问它会有多难。
答案 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)
与绩效相关的调整:
使用分析器发现瓶颈;
使用reflection.emit / Expression Trees预编译某些性能瓶颈的动态逻辑
Mono --gc=sgen --optimize=inline,...
(SGEN垃圾收集器可以产生数量级差异)。另请参阅 man mono
了解大量优化/优化选项MONO_GENERIC_SHARING=none
禁用泛型共享(特别是在支持valuetypes和reftypes时更快地完成特定任务)(不推荐用于常规生产)-optimize+
编译标志(独立于JITter可以对其进行优化的CLR代码)不那么主流:
使用LLVM后端(单击引用:)
使用 mkbundle 创建静态链接的NATIVE二进制图像(已完全JIT,即AOT(提前编译))
以上大多数都有直接的微软吊坠(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小时。