原文链接:https://blog.csdn.net/Jaden_hool/article/details/78437947

方法调用流程

调用一个方法是一个压栈和出栈的过程,调用方法时将栈针压入方法栈,然后执行方法体,方法结束时将栈针出栈,这个压栈和出栈的过程会耗费资源,这个过程中传递形参也会耗费资源。

为什么需要inline?

有些简单的方法会被频繁调用,什么叫简单的方法呢,举个例子:

fun <T> check(lock: Lock, body: () -> T): T {
lock.lock()
try {
return body()
} finally {
lock.unlock()
}
}

这个check方法的方法体中,不会将它的形参再传递给其他方法。我们调用一下 check 方法:

  check(l, {"我是lambda方法体"})//l是一个Lock对象

对于编译器来说,调用 check 方法就要将参数l和 lambda 表达式 {"我是 lambda方法体"} 进行传递,还要将 check 方法进行压栈出栈处理,这个过程就会耗费资源。

如果我们把 check 方法删除,直接执行 check 方法的方法体:

        l.lock()
try {
return "我是lambda方法体"
} finally {
l.unlock()
}

这样做的效果和调用 check方法是一样的,而且不需要压栈出栈了,但是代码是写给人看的,这样写明显产生了代码坏味道,老司机会告诉你,这几行代码需要抽成一个方法,避免多处调用产生冗余代码。于是你就老老实实把这几行代码抽成了 check方法,那么如上所述,一旦这个方法被频繁调用,压栈出栈将会带来性能问题。针对这个问题,kotlin 引入了 inline 关键字。我们在 check 方法前加上 inline关键字:

inline fun <T> check(lock: Lock, body: () -> T): T {
lock.lock()
try {
return body()
} finally {
lock.unlock()
}
}

然后我们再调用 check 方法,编译器就会在编译期帮我们进行优化:

将我们写的代码

  check(l, {"我是lambda方法体"})//l是一个Lock对象

换成

        l.lock()
try {
return "我是lambda方法体"
} finally {
l.unlock()
}

也就是说 inline 关键字实际上增加了代码量,但是提升了性能,而且增加的代码量是在编译期执行的,对程序可读性不会造成影响。

其它

如果 check 方法中的参数需要传递给其他非 inline 方法:

inline fun <T> check(lock: Lock, body: () -> T): T {
lock.lock()
try {
otherCheck(body)//会报错
return body()
} finally {
lock.unlock()
}
} fun <T> otherCheck(body: ()-> T){ }

那么调用 otherCheck 是会报错的,因为 check 方法中的形参 body 现在已经 inline 了,不是一个函数对象了,也就不能作为一个参数传递了,除非在 body 参数前加上 noinline 关键字。

最新文章

  1. MapReduce剖析笔记之三:Job的Map/Reduce Task初始化
  2. WPF多源绑定
  3. Jquery实现账单全部选中和部分选中管理
  4. Linux常用服务部署与优化之NFS篇
  5. linux中wc命令用法
  6. 部署ganglia3.7
  7. 像装软件一样装系统 Win8下怎么装Win7
  8. JAVA使用jdbc连接MYSQL简单示例
  9. Linux网络服务器epoll模型的socket通讯的实现(一)
  10. Linux的more、less
  11. Mobile Computing-天平难题-Uva1354(回溯枚举二叉树)
  12. C程序设计语言练习题1-11
  13. 常见 wifi热点的linux 驱动
  14. CSS图形形状大全
  15. JavaWeb总结(四)—JSP深入解析
  16. bzoj:1941: [Sdoi2010]Hide and Seek
  17. Jhipster 学习(一)jhipster构建项目
  18. Spark Java API 计算 Levenshtein 距离
  19. Java设计模式之动态代理
  20. vue将表格导出为excel

热门文章

  1. 微服务与敏捷开发(Scrum/Kanban)的核心思想之我见
  2. Android Battery 架构【转】
  3. 第二个视频作品《[SpringCloudAlibaba]微服务之注册中心nacos》上线了
  4. c语言从入门到精通的几个阶段
  5. Android Studio学习-连接真机测试教学
  6. rsync高级同步工具
  7. 从零开始手写 dubbo rpc 框架
  8. 通过Ajax的访问zuul的跨域问题解决方案
  9. telerik reporting 在.net core api 使用
  10. 教你用python假装黑客装逼,当着朋友的面破解他的网站密码!