블루 버드 작가.
V8은 구현이 C가 아닌 JavaScript로 작성되도록 약속합니다 . V8을 포함한 모든 JavaScript는 기본 코드로 컴파일됩니다. 또한 사용자 작성 JavaScript는 가능한 경우 기본 코드로 컴파일되기 전에 최적화됩니다 (그리고 가치가있는 경우). 약속 한 구현은 C로 작성되어 많은 이익을 얻지 못하거나 전혀 이익이되지 않는 것입니다. 실제로 JavaScript 객체와 통신을 조작하기 때문에 속도가 느려집니다.
V8 구현은 단순히 블루 버드만큼 최적화되지 않았으며, 예를 들어 promises 핸들러에 배열을 할당합니다 . 각 약속에 두 개의 배열을 할당해야 할 때 많은 메모리가 필요합니다 (벤치 마크는 전체 80k 약속을 생성하여 160k 미사용 배열이 할당 됨). 실제로 99.99 %의 사용 사례는 약속을 두 번 이상 분기하지 않으므로이 일반적인 경우를 최적화하면 메모리 사용량이 크게 향상됩니다.
V8이 블루 버드와 동일한 최적화를 구현하더라도 사양에 의해 여전히 방해를받습니다. new Promise
ES6에는 근본적인 약속을 만들 수있는 다른 방법이 없으므로 벤치 마크 (블루 버드의 안티 패턴) 를 사용해야 합니다. new Promise
는 약속을 만드는 매우 느린 방법입니다. 먼저 executor 함수가 클로저를 할당하고 두 번째로 두 개의 별도 클로저가 인수로 전달됩니다. 약속 당 3 개의 폐쇄가 할당되었지만 폐쇄는 이미 최적화 된 약속보다 더 비싼 개체입니다.
Bluebird를 사용 promisify
하면 많은 최적화가 가능하고 콜백 API를 소비하는 훨씬 편리한 방법이며 전체 모듈을 한 줄에 약속 기반 모듈로 변환 할 수 있습니다 ( promisifyAll(require('redis'));
).