首先我们理解Why?

# Why

动态语言跟静态语言的一个区别就是类型是动态决定的,也就是在运行时才能知道类型。

这带来什么问题呢?

比如最简单的取值,table.height,静态语言,编译时就能知道offset_heigth,动态语言,编译时不知道offset_heigth,需要运行时获取。

class Thing {Thing(int) {height = 1}void get();int height;}Thing table = new Thing(1);
table.height;

如果是静态语言,取值非常快,因为height的索引在编译时就知道了,因此只需要一个load指令即可。

r0 = #table_ptr;
$height = load(r0, #offset_height = 0)

如果时动态语言,取值非常慢,编译时不知道height的索引,需要进入运行时判断height的索引,因此会需要一个call runtime,然后一个map查找索引。

r0 = #table_ptroffset_height = call_runtime(table_ptr, "height")$height = load(r0, #offset_height)void call_runtime(table_ptr, "height") {if (table_ptr has no type of "height") {map, index = new_map("height")table_ptr.map = map;return index;}if (table_ptr has type of "height") {map = table_ptr.mapindex = map["height"]return index}
}    

可以看到,差了很多代码。

# How

那么怎么改进呢?

引入fast path和slow path。非常经典。

因为第一次我们一定不知道类型,是必须进入runtime的,第一次是改进不了的。

但是第二次就可以。因为我们有了第一次运行,知道了第一次运行的结果,我们可以用这次结果设计为fast path。

这个改进的前提之一就是,动态类型对象的类型不会一直在改变,否则我们就一直进入不了fast path。

所以,假设第二次访问时,类型没有改变,因为我们在第一次存储了类型信息,即,我们知道了offset_height,因此,访问的代码如下:

int get_height() {r0 = #table_ptr;
if ( no change of type ) // the same map {// fast path$height = load(r0, #offset_height = 0) // we know the offset_height from pre-run.return $height
} else {// slow pathreturn call_runtime_get_height();
}}

在假设类型不是经常变化成立的情况下,那么动态类型语言和静态类型语言在这里的差距就只有一个if语句的差距,而不是整个runtime了。

# 参考

https://en.wikipedia.org/wiki/Inline_caching

https://mrale.ph/blog/2012/06/03/explaining-js-vms-in-js-inline-caches.html

https://wingolog.org/archives/2018/02/07/design-notes-on-inline-caches-in-guile

转载于:https://www.cnblogs.com/simpleminds/p/9956774.html

理解动态语言inline cache优化相关推荐

  1. C语言 --- 动态内存管理(上)+优化版通讯录+笔试题

    文章目录 前言 一.为什么存在动态内存分配 二.动态内存函数的介绍 2.1.malloc函数+free函数 2.2.calloc函数+free函数 2.3.realloc函数 三.常见的动态内存错误 ...

  2. python语言的理解-Python动态语言理解

    1. 动态语言的定义 动态编程语言 是 高级程序设计语言 的一个类别,在计算机科学领域已被广泛应用.它是一类 在运行时可以改变其结构的语言 :例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删 ...

  3. 如何理解静态语言和动态语言

    类型系统按照类型检查的时机来分类,分为动态类型和静态类型,动态是在运行时候才检查数据类型,静态是在编译时候检查数据类型 静态语言是在编译期间就会做数据类型的检查,也就是要在写代码的时候就声明变量的数据 ...

  4. C语言中的优化技巧总结

    1.选择合适的算法和数据结构 选择一种合适的数据结构很重要,如果在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多.数组与指针语句具有十分密切的关系,一般来说,指针比较灵活简洁,而数组 ...

  5. 编程语言的发展趋势及未来方向(4):动态语言

    我下面继续要讲的是动态语言,这也是我之前提到的三种趋势之一. 我还是尝试着去找到动态语言的定义,但是你也知道--一般地说,动态语言是一些不对编译时和运行时进行严格区分的语言.这不像一些静态编程语言,比 ...

  6. CPU CACHE优化 性能优化方法和技巧

    转载来源:性能优化方法和技巧 系列目录 性能优化方法和技巧 性能优化的方法和技巧:概述 性能优化的方法和技巧:代码 性能优化的方法和技巧:工具 这是一个可以用一本书来讲的话题,用一系列博客来讲,可能会 ...

  7. 最热网友收藏:深入理解C语言指针的奥秘((2007年第3周)

    2007年第3周最热网友收藏 深入理解C语言指针的奥秘(93),共121人收藏,yanglilibaobao首先收藏 我来做个好人吧,40种网站设计常用技巧(78),共440人收藏,wuzeng200 ...

  8. c语言cyc函数,深入理解C语言

    导读:Dennis Ritchie过世了,他发明了C语言,一个影响深远并彻底改变世界的计算机语言.一门经历40多年的到今天还长盛不训的语言,今天很多语言都受到C的影 响,C++,Java,C#,Per ...

  9. 编译型和解释型、动态语言和静态语言、强类型定义语言和弱类型定义语言

    一.编译型与解释型语言 我们编写程序也就是源代码基本是用高级编程语言,比如JavaScript, java, c等等,这些语言计算机是不理解的,所以需要转化(翻译)成计算机理解的机器语言,或者说目标C ...

最新文章

  1. 记录 android 开发的一个 面试 问题
  2. 2020 操作系统第零天复习(知识点总结)
  3. split函数python 未定义_python split函数基本用法
  4. 桥本有菜java,深入浅出Extjs4.1.1(ExtJS组件、ExtJS对Ajax支持、ExtJS布局)配在线选课系统实战...
  5. 设计模式1-简单工厂模式
  6. 单片机如何在一数据包前加标识呢_单挑Google面试官,一上来就问我Chrome底层原理和HTTP协议(万字长文)...
  7. CountDownLatch源码解读
  8. pytorch 介绍
  9. 计算机炫酷功能,【实用】上班族必备!10个实用电脑炫酷小技巧~
  10. Android计算器LinearLayout实现布局
  11. 函数计算机使用说明,SHARP-EL506P 函数计算器的使用说明
  12. CF Canada Cup 2016 D 优先队列
  13. 【苹果家庭群发推】创作AppleScript脚本来控制MacOS附有的iMessage客户端停止考据,近似于组iMessage
  14. 转:激励,如何做更有效
  15. Ubuntu 重置登录密码
  16. MySQL引擎的理解
  17. 浅显易懂地看LLC变换器(一)
  18. Scrapy(官网 http://scrapy.org/)爬虫(一)
  19. 实现用RPG Maker Mv/Mz完成即时战斗系统
  20. 简单好用的安卓程序开发平台E4A

热门文章

  1. Angular——单页面与路由的使用
  2. Python之路_Day13
  3. iOS中NSLog输出格式大全
  4. 相似图片搜索的原理(转)
  5. 问题与解答 [Questions Answers]
  6. 开发海思3520a遇到的问题
  7. 基于java人体检测技术_几篇深度图人体检测论文的实现
  8. 后端用python还是php_【后端开发】2019学python还是php
  9. Homebrew软件包管理器中发现RCE漏洞,小心你的Mac和Linux
  10. 数据智能构建管理平台Dataphin V2.9.4.3版本发布