e2tox / blog

技术博客,点开Issues查看。看我心情,不定期更新。
28 stars 0 forks source link

巧用ES系列3: 性能优化的利器CodeGen #6

Open e2tox opened 5 years ago

e2tox commented 5 years ago

什么是CodeGen?

很多文章都提到过CodeGen,但是搜遍NodeJS文档都没有任何CodeGen的内容,这是因为CodeGen是一个概念,它的主要两个API就是函数本身 Function 和 AsyncFunction

CodeGen如何提升性能?

在JavaScript中,函数需要接受参数,并且根据参数在执行相应的代码,参数可以从函数调用过程中传递,也可以通过闭包传递,这些传递参数的过程远远比硬编码要慢。因此,我们在知道所有参数的前提下,可以通过硬编码来提高函数的执行效率,这个硬编码就是CodeGen,也就是在函数第一次执行的时候动态的生成硬编码函数,以后每次调用,都可以达到最大性能。

怎么使用CodeGen

Function在JavaScript标准中存在,所以可以直接通过Function构造器构造一个函数

const sum = new Function('a', 'b', 'return a + b');

console.log(sum(2, 6));
// expected output: 8

AsyncFunction在JavaScript标准中不存在,所以必须做一点额外操作来获取AsyncFunction对象

const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor;

const sum = new AsyncFunction('a', 'b', 'return a + b');

sum(2, 6).then(result => {
    console.log(result);
});

如何学习CodeGen

首先要找出程序中影响性能的部分,其次对其进行分析,看看能不能通过硬编码进行改善,如果可以,那就使用CodeGen进行动态硬编码,最后通过调用生成的动态硬编码函数来改善程序性能。

目前 ajv (Another Json Validator) 是CodeGen的一大代表作,是目前最快的JSON Scheme验证器,其就在JSON Schema背后硬编码了验证的逻辑,所以获得巨大的性能优势。

注: 如果运行时允许,WebAssembly 技术可以对 JavaScript 的性能进行更大幅度的提升

祝大家编程愉快