問題タブ [erlang-nif]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - Erlang、関数間で nif オブジェクトを渡す
C nif code
functionに andを書くとnew
、スタック構造体 with を作成し、それをenif_alloc_resource
返します。function を使用すると、常にerlang でenif_make_resources
返されます。<<>>
ここに私のCコードがあります:
現在、関数new_nif
は常に返さ<<>>
れますが、チェックしたのは !res
ではありませNULL
ん。何が問題ですか?
c - Erlang、シェルを再起動せずに nif ライブラリをリロードまたはアップグレードすることは可能ですか?
nif ライブラリがあり、再コンパイルするたびに、シェルを再起動してこのライブラリをリロードまたはアップグレードする必要があります。
これが私のアーランコードです:
erlang モジュールをコンパイルするたびに、次のエラーが発生します。
関数を呼び出すとinit/0
、次のエラーが発生します。
{error,{reload,"Reload not supported by this NIF library."}}
この問題を修正して、シェルを再起動せずに新しい nif ライブラリをロードする方法はありますか?
erlang - NIF から Erlang 関数を呼び出す
NIF から Erlang 関数 (コールバック関数) を呼び出すことは可能ですか?
ドキュメント ( http://www.erlang.org/doc/man/erl_nif.html ) を読みましたが、その方法が見つかりませんでした。
c - Unicode 照合 NIF の実行は Pure Erlang 実装よりも遅い
既存の Unicode 照合ライブラリ (Erlang で記述) を NIF 実装として書き直して最適化しようとしています。主な理由は、照合が CPU を集中的に使用する操作であるためです。
実装へのリンク: https://github.com/abhi-bit/merger
Pure Erlang ベースの優先キューによる 1M 行の Unicode 照合:
NIF ベースの二項ヒープによる 1M 行の Unicode 照合:
これは珍しいことです。おそらく最大 10 倍高速になると予想していました。
オンにしましたがeprof
、fprof
NIF モジュールに関してはあまり役に立ちません。以下はeprof
、主要な機能について述べたものです。
動的配列を使用したバイナリヒープに基づくユニコード照合の純粋な C 実装があり、はるかに高速であるため、NIF 実装を高速化できると確信しています。
私がここに持っている具体的な質問:
- Erlang <-> NIF モジュールでの C 通信により、どれくらいの速度低下が予想されますか? この場合、純粋な C と NIF の実装の間で速度がおそらく 30 倍以上になります。
- この場合のように、NIF 関連のスローダウンをデバッグするのに役立つツールは何ですか? 関数呼び出しを確認するために使用
perf top
してみましたが、上位のもの (一部の 16 進アドレスが表示されていました) は「beam.smp」からのものでした。 - NIF を最適化するために検討すべき領域は何ですか? 例: Erlang から C へのデータ転送、およびその逆のデータ転送を最小限に抑える必要があると聞いたことがありますが、他に考慮すべき領域はありますか?
c - Erlang の NIF を使用して、ERL_NIF_TERM で malloc を使用するにはどうすればよいですか?
私は Erlang の NIF を使用しています。C 関数の結果は、3 つのポイントのタプルのリストの形式で erlang に送り返したい配列であり、それぞれが 2 つの double のタプルです。
この配列を作成するには、現在これを行っています:
これまでのところ、うまくいくようです。しかし、それは正しいですか?私の推論は、配列のすべてのセルにans
、サイズが の double が 6 つあるERL_NIF_TERM
ため、これに従って割り当てます。
しかし、それは本当ですか?
タプルを数えるべきですか?
一体、どのくらいのサイズERL_NIF_TERM
ですか?double insideERL_NIF_TERM
は int inside と同じサイズERL_NIF_TERM
でしょうか? 2 int のタプルもERL_NIF_TERM
同じサイズですか?
c - Erlang nif がアップグレードされない
nif
私はアーランでライブラリを書いています。load
また、関数upgrade
も書きunload
ます。
これは私のコードです:
erlang シェルでこれをロードして関数nif
を実行checksum
すると、戻り123
、すべて問題ありません!
その後、戻り値をchecksum
to に変更し、コマンドを使用して to erlang vm を123456
コンパイルしてロードします。nif
l(mynif)
これが問題です!関数を実行checksum
すると、戻り値はそうでなければなりませんが123445
、まだアップグレードされていません。123
nif
何が問題ですか?私はよく検索し、いくつかの例とライブラリをテストしましたjiffy
が、うまくいきませんでした。
c - 作成されたスレッドの問題からの Enif_send 関数
作成したスレッドから enif_send を呼び出そうとしました。主に、nif から送信された受信メッセージをリッスンする erlang プロセスがあります。
まず、enif 関数で erlang プロセスの pid を取得してキャストし、enif_send を呼び出して次のようにメッセージを送信します。
この段階まで、erlang プロセスにメッセージを送信できます。
その後、enif_thread を生成し、それに env と pid をパラメーターとして渡し、次のようにスレッドから enif_send を呼び出そうとしました。
しかし、enif_is_pid で pid をチェックすると、スレッドを生成する関数でチェックされた同じ pid であっても、無効な pid を取得したため、送信に失敗しました。任意のアイデアをお願いします?