NGen并不能提升代码执行效率

作者:V君 发布于:2015-8-23 21:46 Sunday 分类:折腾手记

TL;DR: 看这里 

实际上NGen.exe仅仅是加快应用程序的启动速度,执行时的性能并不比JITCompiler编译的代码快。主要原因是,编译代码时, NGen无法像JIT编译器那样对最终的执行环境作出许多假设,这会造成NGen.exe产生较差的代码。例如, NGen不能优化一些CPU指令, 对静态字段的访问需要间接的操作而不能直接访问,因为静态字段实际的地址需要在运行时刻才能知道。NGen到处插入代码来调用类的构造函数,因为它不知道代码执行的次序,不知道类的构造函数是否已经被调用。


听我扯扯:

一直用着SevenZipSharp(7z#), 这货相当方便, 然而现在我想设计自己的压缩归档, 

需要选择压缩算法纯粹的对数据块进行压缩, 

然而7z#似乎没有提供这样的接口, 算法的实现又在本地的7z.dll里...

最重要的是不跨平台, linux 没法用.(尽管7z#似乎在出mono版本, 但貌似已经熄火两年...)

 

于是又找到了个纯托管的实现 -- SharpCompress .

嗯嗯 这货很好的实现了各种算法的纯粹压缩流, 

有 LZMA, LZMA2 (仅解压) ,Gzip, Bzip2, Deflate, PPMd .


在我设计的压缩归档里面, 

首先将要压缩的数据挨个调用这些算法的极限压缩, 选择最高压缩比的算法,

以一个字节标识到压缩后数据块前面,

如果所有的算法输出都比原始数据大, 那么直接存储, 数据块前面的标识会注明

 

跑了一遍下来

 

Ppmd:   3,404

Deflate: 2,160

Store:  1,996

Lzma:    393

BZip2:    595

--------------

Total:   8,548

 

发现PPMd算法被使用次数最多, 然而PPMd每次执行都时间几乎都在秒级以上

欲让它执行得快一点. 于是想起JIT这回事,

咕狗搜索 Force JIT 找到 NGen 试着产生 SharpCompress 的 ni.dll

用 procexp 查看确实被加载后, 对压缩调用计时.

然并卵, 速度根本没有提升嘛! 更要命的是解压反而比压缩慢, 这是闹哪样?


接着查 NGen 性能, 这时才明白原来根本就是用错东西了...

打一下自己的脸, 找C或++的实现, 然后做个C++/CLI或者导出函数来pinvoke吧.

(我大mono可是支持pinvoke的哟)


标签: 软件开发 C# JIT

评论(0) 引用(0) 浏览(547)

Powered by emlog 去你妹的备案 sitemap