Автор блакитної птиці тут.
Реалізація обіцянок V8 написана на JavaScript, а не C. Весь JavaScript (у тому числі власний V8) складений у рідний код. Додатково написаний користувачем JavaScript оптимізується, якщо можливо (і варто того), перед тим, як компілювати до рідного коду. Обіцяє реалізація - це те, що не писало б великої або взагалі користі від написання на C, адже це зробило б лише повільніше, оскільки все, що ви робите, - це маніпулювання об'єктами JavaScript та спілкування.
Реалізація V8 просто не настільки оптимізована, як bluebird, вона для примірників виділяє масиви для обробників обіцянок . Це займає багато пам’яті, коли кожна обіцянка також повинна виділити пару масивів (Орієнтир створює загальні 80-кілограмові обіцянки, так що виділено 160 000 невикористаних масивів). Насправді 99,99% випадків використання ніколи не виконують обіцянки не раз, тому оптимізація для цього звичайного випадку отримує величезні покращення використання пам'яті.
Навіть якби V8 здійснив ті ж оптимізації, що і синій птах, це все-таки заважатиме специфікації. Базовий показник повинен використовувати new Promise
(анти-візерунок у блакитного птаха), оскільки немає іншого способу створити кореневу обіцянку в ES6. new Promise
це надзвичайно повільний спосіб створення обіцянки, по-перше функція виконавця виділяє закриття, по-друге йому передаються 2 окремих закриття як аргументи. Це 3 закриття, виділені на обіцянку, але закриття - це вже більш дорогий об'єкт, ніж оптимізована обіцянка.
Bluebird може використовувати, promisify
що дозволяє безліч оптимізацій і є набагато зручнішим способом використання API зворотного виклику, і це дозволяє конвертувати цілі модулі в модулі, засновані на обіцянках, в одному рядку ( promisifyAll(require('redis'));
).