Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

编译器优化&JIT优化 #42

Open
ichengzi opened this issue Apr 15, 2021 · 0 comments
Open

编译器优化&JIT优化 #42

ichengzi opened this issue Apr 15, 2021 · 0 comments

Comments

@ichengzi
Copy link
Owner

ichengzi commented Apr 15, 2021

c# 编译器

  1. 图中是 c# release 模式编译

  2. 看编译后的IL代码, 未使用的代码 var f1 = 1.0f 直接给消除掉了, 但是 var obj = new Object(); 没能消除。 因为 var f1赋值的是基础类型, 编译器可以简单判定代码不使用也不会引起其他副作用, 所以可以简单消除,称之为 无效代码消除(Dead Code Elimination).

  3. var obj= new Object() 不能消除的原因也很简单直接, 假如 Object 是个很复杂的类, 构造函数里做了很多初始化的操作, 消耗了很多资源。 eg: 初始化了数据库连接池,http client 连接池等等。如果消除了 new 对象的代码, 可能导致程序逻辑错误。 虽然很少在构造器里做这么重且反直觉的操作, 但是编译器不能保证一定没有,所以这些逻辑上确实没用的代码, 编译器是无法消除的。 但IDE可以提示程序员处理

  4. 这种可以消除的代码, 编译器会给出明确的 warning,所以关注编译器的warning也是代码优化的方法之一

  5. c# debug 模式编译, ①的代码仍会保留

  6. 方法内联(inline) 也是编译器的重要优化手段之一, C#编译器未inline, JIT编译时有inline优化

  7. 不清楚javac的编译配置, ①的代码, 在javac的编译下, 字节码中仍保留, 在JVM运行时才做的 无效代码消除(Dead Code Elimination)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant