Похоже, что Bun — это новый крутой парень в сценарии выполнения javascript. Выглядит очень многообещающе и все такое, но так ли он быстр?
Я проведу ряд простых тестов, чтобы посмотреть, заметна ли разница в производительности даже на небольшом уровне.
Сегодня я сосредоточусь только на производительности запросов и операций в секунду.
Установка Bun
Но сначала я начну установку bun в директорию bun.
curl https://bun.sh/install | bash
И создадим базовый ответ
// http.js
export default {
port: 3000,
fetch(request) {
return new Response("Welcome to Bun!");
},
};
Настройка узла
Теперь я могу перейти к node. Поскольку у меня уже установлен Node.js, мне нужно только создать базовый ответ.
const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
Теперь я готов повеселиться.
Производительность Http-запросов
Для проверки производительности HTTP-запросов я протестирую обе реализации с помощью Artillery.
Artillery можно установить через npm
npm i artillery
И поставляется с хорошим CLI для выполнения быстрого нагрузочного теста.
artillery quick --count 500 --num 100 http://localhost:3000
Это позволит запустить 500 виртуальных пользователей со 100 запросами каждый.
Результаты следующие:
http | узел | булочка |
---|---|---|
http.codes.200 | 50000 | 50000 |
http.request_rate | 1585/сек | 1617/сек |
http.requests | 50000 | 50000 |
http.responses | 50000 | 50000 |
http.response_time | Узел | Булочка |
---|---|---|
min | 0 | 0 |
max | 143 | 73 |
медиана | 32.8 | 22.9 |
p95 | 63.4 | 36.2 |
p96 | 100.5 | 50.9 |
vusers.session_length | Узел | Булочка |
---|---|---|
мин | 1835.3 | 1103.1 |
max | 4989.2 | 2805.9 |
медиана | 3678.4 | 2566.3 |
p95 | 4770.6 | 2780 |
p99 | 4867 | 2780 |
(в миллисекундах)
Результаты далеки от заявленной производительности Bun, но все же очень солидные. Во всех аспектах Bun является победителем.
Операции в секунду
Здесь я проведу тест на вычисление простых чисел, чтобы посмотреть, сколько времени требуется для каждого из них.
Для тестирования вычисления простых чисел я выполню очень простой код и воспользуюсь performance.now()
для измерения времени выполнения.
(function (maxNumbers = 30000) {
let start = performance.now();
let primeNumbers = []
let numberToCheck = 1;
while (primeNumbers.length < maxNumbers) {
if (isPrimeNumber(numberToCheck)) {
primeNumbers.push(numberToCheck);
}
numberToCheck++;
}
console.log(performance.now() - start);
})();
function isPrimeNumber(number) {
for (let i = 2; i < number; i++) {
if (number % i === 0) return false;
}
return true;
}
Результаты вычисления простых чисел следующие (в миллисекундах):
простые числа | узел | булочка |
---|---|---|
100 | 1.035 | 0.618 |
500 | 4.5071 | 3.223 |
1000 | 9.3060 | 8.680 |
5000 | 209.8485 | 198.4309 |
10000 | 909.618 | 849.832 |
30000 | 9113.5302 | 8559.282 |
На этот раз результаты не сильно отличаются, но Bun снова побеждает.
Bun все еще находится в бета-версии, и мы должны иметь это в виду. Если на данном этапе результаты уже выглядят многообещающе, наступят интересные времена, если совершенствование продолжится в том же духе, и, кто знает, может быть, через несколько лет Bun найдет свое место на рынке.