Ускорение Node.js: Нативные Модули И Cuda

Иногда разработчики различных веб-проектов сталкиваются с необходимостью обработки больших объемов данных или использования ресурсоемкого алгоритма.

Старые инструменты уже не обеспечивают требуемой производительности; приходится арендовать/покупать дополнительные вычислительные мощности, что наталкивает на мысль переписать медленные участки кода на C++ или другие быстрые языки.

В этой статье я расскажу о том, как можно попытаться ускорить Node.JS (который сам по себе считается довольно быстрым).

Мы поговорим о нативных расширениях, написанных на C++.



Коротко о расширениях

Итак, у вас есть веб-сервер на Node.JS и вы получили некую задачу с ресурсоемким алгоритмом.

Для реализации задачи было решено написать модуль на языке C++.

Теперь нам нужно разобраться, что это такое — нативное расширение.

Архитектура Node.JS позволяет подключать модули, упакованные в библиотеки.

Для этих библиотек созданы JS-обертки, с помощью которых вы можете вызывать функции этих модулей прямо из JS-кода вашего сервера.

Многие стандартные модули Node.JS написаны на C++, но это не мешает вам использовать их с таким же удобством, как если бы они были написаны на самом JavaScript. Вы можете передавать в расширение любые параметры, перехватывать исключения, выполнять любой код и возвращать обратно обработанные данные.

В ходе статьи мы поймем, как создавать нативные расширения, и проведем несколько тестов производительности.

Для тестов мы возьмем простой, но ресурсоемкий алгоритм, который можно выполнить на js и C++.

Например, вычислим двойной интеграл.



Что считать?

Возьмем функцию:

Ускорение node.js: нативные модули и CUDA

Эта функция определяет следующую поверхность:

Ускорение node.js: нативные модули и CUDA

Чтобы найти двойной интеграл, нам нужно найти объем фигуры, ограниченной данной поверхностью.

Для этого разобьем фигуру на множество параллелепипедов, высота которых равна значению функции.

Сумма их объемов даст нам объем всей фигуры и числовое значение самого интеграла.

Чтобы найти объем каждого параллелепипеда, разделим площадь под фигурой на множество маленьких прямоугольников, затем умножим их площади на значение нашей функции в точках на краях этих прямоугольников.

Чем больше параллелепипедов, тем выше точность.

Код js, который выполняет эту интеграцию и показывает нам время выполнения:

   

var func = function(x,y){

Теги: #node.js #cuda #высокая производительность #Высокая производительность #Разработка веб-сайтов #node.js
Вместе с данным постом часто просматривают: