Tác giả Bluebird ở đây.
V8 hứa triển khai được viết bằng JavaScript chứ không phải C. Tất cả JavaScript (bao gồm cả V8) được biên dịch thành mã gốc. Ngoài ra, JavaScript do người dùng viết được tối ưu hóa, nếu có thể (và đáng giá), trước khi được biên dịch thành mã gốc. Hứa hẹn thực hiện là một cái gì đó sẽ không có lợi nhiều hoặc hoàn toàn không được viết bằng C, trên thực tế, nó chỉ làm cho nó chậm hơn vì tất cả những gì bạn đang làm là thao túng các đối tượng và giao tiếp JavaScript.
Việc triển khai V8 đơn giản là không được tối ưu hóa như bluebird, ví dụ, nó phân bổ các mảng cho các trình xử lý của lời hứa . Điều này cần rất nhiều bộ nhớ khi mỗi lời hứa cũng phải phân bổ một vài mảng (Điểm chuẩn tạo ra 80k lời hứa tổng thể để đó là 160k mảng không sử dụng được phân bổ). Trong thực tế, 99,99% các trường hợp sử dụng không bao giờ hứa hẹn nhiều hơn một lần vì vậy tối ưu hóa cho trường hợp phổ biến này sẽ cải thiện việc sử dụng bộ nhớ lớn.
Ngay cả khi V8 thực hiện các tối ưu hóa tương tự như bluebird, nó vẫn sẽ bị cản trở bởi thông số kỹ thuật. Điểm chuẩn phải sử dụng new Promise
(một mô hình chống trong bluebird) vì không có cách nào khác để tạo lời hứa gốc trong ES6. new Promise
là một cách cực kỳ chậm để tạo ra một lời hứa, đầu tiên hàm thực thi phân bổ một bao đóng, thứ hai nó được thông qua 2 bao đóng riêng biệt làm đối số. Đó là 3 lần đóng được phân bổ cho mỗi lời hứa nhưng việc đóng lại đã là một đối tượng đắt hơn so với lời hứa được tối ưu hóa.
Bluebird có thể sử dụng promisify
cho phép nhiều tối ưu hóa và là cách tiêu thụ API gọi lại thuận tiện hơn nhiều và nó cho phép chuyển đổi toàn bộ mô-đun thành các mô-đun dựa trên lời hứa trong một dòng ( promisifyAll(require('redis'));
).