惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tenable Blog
月光博客
月光博客
雷峰网
雷峰网
WordPress大学
WordPress大学
博客园 - 司徒正美
Last Week in AI
Last Week in AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
Visual Studio Blog
H
Help Net Security
Engineering at Meta
Engineering at Meta
Google DeepMind News
Google DeepMind News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
S
Security @ Cisco Blogs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
爱范儿
爱范儿
W
WeLiveSecurity
J
Java Code Geeks
Forbes - Security
Forbes - Security
H
Hacker News: Front Page
T
Threatpost
The Cloudflare Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
N
Netflix TechBlog - Medium
Latest news
Latest news
V2EX - 技术
V2EX - 技术
小众软件
小众软件
T
The Blog of Author Tim Ferriss
A
Arctic Wolf
B
Blog RSS Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
I
InfoQ
C
Check Point Blog
N
News | PayPal Newsroom
Cyberwarzone
Cyberwarzone
V
V2EX
TaoSecurity Blog
TaoSecurity Blog
P
Privacy & Cybersecurity Law Blog
Microsoft Security Blog
Microsoft Security Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
D
DataBreaches.Net
F
Fortinet All Blogs
阮一峰的网络日志
阮一峰的网络日志
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
IT之家
IT之家
K
Kaspersky official blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Google DeepMind News
Google DeepMind News
C
CXSECURITY Database RSS Feed - CXSecurity.com
www.infosecurity-magazine.com
www.infosecurity-magazine.com

博客园 - 柠茶

asp.net webapi 参数绑定总结 asp.net webapi 参数绑定总结 javascript引用类型 javascript变量,作用域和内存问题 javascript基本概念 javascript中所谓的“坑”收录 JS调用webservice的两种方式 反射体验(转) 关于可空类型 学习IIS & MVC的运行原理 (转) MVC-READ5(asp.net web from PK asp.net MVC) MVC-READ4 MVC-READ3(视图引擎主要类关系图) MVC-READ2 MVC-READ1 @@ERROR和@@ROWCOUNT的用法 异常以及异常处理框架探析(转) .Net深入学习序列化和反序列化 (转) 可扩展对象模式(转)
什么是Emit,什么是反射,二者区别到底是什么?(转)
柠茶 · 2014-09-04 · via 博客园 - 柠茶
Emit的准确定义,我们看看微软给出的答案

System.Reflection.Emit 命名空间包含{

允许编译器或工具发出元数据发出 Microsoft 中间语言 (MSIL) ,并可选择在磁盘上生成 PE 文件的类。

这些类的主要客户端是脚本引擎和编译器。

}

Emit可以直接让编译器发出元数据及msil,这样做的优势又是什么?

MSIL是将.NET代码转化为机器语言的一个中间过程。它是一种介于高级语言和基于Intel的汇编语言的伪汇编语言。当用户编译一个.NET程序时,编译器源代码翻译成Microsoft 中间语言 (MSIL),它是一组可以有效地转换为本机代码且独立于CPU的指令。当执行这些指令时,实时(JIT)编译器将它们转化为CPU特定的代码.

所以,我们的.NET程序最终都是以这些中间语言存储起来的,在运行后,又由即时编译器直接转换成真正的机器语言执行. emit这种优势在于可以在程序动态运行的过程中,直接生成IL运行(可谓灵活且不失高效)

反射的原理及性能问题引用Jeffrey Richter的一段话: 元数据是用一系列的表来存储的.生成一个程序集或模块时,编译器会创建一个类型定义表、一个字段定义表、一个方法定义表以及其他表.利用反射命名空间(sytem.reflection,所以可知emit是其一个附属,不是独立的)中包含的一些类型,可以用代码来解析(就是所谓的反射)这些元数据表.

反射有两个缺点:1.反射无法在编译期间保证类型的安全;2.反射速度慢.(我们需要使用sytem.reflection命名空间中的类型扫描程序集的元数据,反射要不断地执行字符串的搜索) 

总结反射包含emit,反射性能低原因在于需要扫描程序集或模块的元数据表.emit性能高,在于能够动态生成msil立即执行.它们各据其位,所以用emit时其实你就在用反射(至少你需要它).为了提高性能,我们可以动态创建一些方法来达到我们想要的目的(动态代理).

 (术语有不足之处,希望纠正)