毎日プログラミング奮闘

日々進化するプログラミングの学習ブログ

N-APIを使って、JavaScriptからC++で書かれたクイックソートをよんでみる

N-APIを使って、C++を楽しむ

Nodeを調べているときに、N-APIを使えばJavaScriptからC++が呼べるというもの見つけた。C++好きとしてはどうしてもJavaScriptからC++を呼び出してみたい。そしてできれば、JavaScriptC++の速度比較なんてものをしたい。

アドオンの設定

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 )