N-APIを使って、JavaScriptからC++で書かれたクイックソートをよんでみる
N-APIを使って、C++を楽しむ
Nodeを調べているときに、N-APIを使えばJavaScriptからC++が呼べるというもの見つけた。C++好きとしてはどうしてもJavaScriptからC++を呼び出してみたい。そしてできれば、JavaScriptとC++の速度比較なんてものをしたい。
アドオンの設定
NodeからC++のアドオンする方法は下記のサイトを参考にした。
N-API を使って Node.js に C++ によるアドオンを実装する最短の道。 - Qiita
配列を呼ぶ方法
配列を呼び出す方法がのってなくて苦労した。
色々調べていると、海外で参考になりそうなサイトを見つけた。
N-API add-on and JS code performance comparison | by Denis Malykhin | Medium
c++ - Node-Addon-Api Pass Array As Function Argument - Stack Overflow
完成プログラム。
GitHub - naotaka0608/node-sort-test
addon.cpp内で配列のデータの受け渡し方法がわからなかった。 わかってしまうと簡単だが、けっこう苦戦してしまった。
#include <napi.h> #include <iostream> #include <time.h> #include "./myLib/sortLib.h" using namespace Napi; Napi::Array QuickSortJS( const CallbackInfo& info ) { Napi::Env env = info.Env(); // 引数 1 Array array_val = info[ 0 ].As<Array>(); const int max_value = array_val.Length(); int *array = new int[max_value]; // int配列に移し替え for(int i=0; i<max_value; i++){ Napi::Value v = array_val[i]; if (v.IsNumber()){ array[i] = (int)v.As<Napi::Number>(); } } // 引数 2 と 3 int start, end; start = info[ 1 ].As<Number>().Int32Value(); end = info[ 2 ].As<Number>().Int32Value(); // ソート SortLib sortLib; sortLib.QuickSort(array, start, end); // Napi配列に移し替え Napi::Array outputArray = Napi::Array::New(env, max_value); for (int i=0; i<max_value; i++) { outputArray[i] = Napi::Number::New(env, array[i]); } delete[] array; return outputArray; } Object Init( Env env, Object exports ) { exports.Set( String::New( env, "quickSortJS" ), Function::New( env, QuickSortJS ) ); return exports; } NODE_API_MODULE( addon, Init )