Open e2tox opened 5 years ago
很多文章都提到过CodeGen,但是搜遍NodeJS文档都没有任何CodeGen的内容,这是因为CodeGen是一个概念,它的主要两个API就是函数本身 Function 和 AsyncFunction
在JavaScript中,函数需要接受参数,并且根据参数在执行相应的代码,参数可以从函数调用过程中传递,也可以通过闭包传递,这些传递参数的过程远远比硬编码要慢。因此,我们在知道所有参数的前提下,可以通过硬编码来提高函数的执行效率,这个硬编码就是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进行动态硬编码,最后通过调用生成的动态硬编码函数来改善程序性能。
目前 ajv (Another Json Validator) 是CodeGen的一大代表作,是目前最快的JSON Scheme验证器,其就在JSON Schema背后硬编码了验证的逻辑,所以获得巨大的性能优势。
注: 如果运行时允许,WebAssembly 技术可以对 JavaScript 的性能进行更大幅度的提升
祝大家编程愉快
什么是CodeGen?
很多文章都提到过CodeGen,但是搜遍NodeJS文档都没有任何CodeGen的内容,这是因为CodeGen是一个概念,它的主要两个API就是函数本身 Function 和 AsyncFunction
CodeGen如何提升性能?
在JavaScript中,函数需要接受参数,并且根据参数在执行相应的代码,参数可以从函数调用过程中传递,也可以通过闭包传递,这些传递参数的过程远远比硬编码要慢。因此,我们在知道所有参数的前提下,可以通过硬编码来提高函数的执行效率,这个硬编码就是CodeGen,也就是在函数第一次执行的时候动态的生成硬编码函数,以后每次调用,都可以达到最大性能。
怎么使用CodeGen
Function在JavaScript标准中存在,所以可以直接通过Function构造器构造一个函数
AsyncFunction在JavaScript标准中不存在,所以必须做一点额外操作来获取AsyncFunction对象
如何学习CodeGen
首先要找出程序中影响性能的部分,其次对其进行分析,看看能不能通过硬编码进行改善,如果可以,那就使用CodeGen进行动态硬编码,最后通过调用生成的动态硬编码函数来改善程序性能。
目前 ajv (Another Json Validator) 是CodeGen的一大代表作,是目前最快的JSON Scheme验证器,其就在JSON Schema背后硬编码了验证的逻辑,所以获得巨大的性能优势。
祝大家编程愉快