問題タブ [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.

0 投票する
0 に答える
454 参照

c - Erlang、関数間で nif オブジェクトを渡す

C nif codefunctionに andを書くとnew、スタック構造体 with を作成し、それをenif_alloc_resource返します。function を使用すると、常にerlang でenif_make_resources返されます。<<>>

ここに私のCコードがあります:

現在、関数new_nifは常に返さ<<>>れますが、チェックしたのは !resではありませNULLん。何が問題ですか?

0 投票する
3 に答える
1271 参照

c - Erlang、シェルを再起動せずに nif ライブラリをリロードまたはアップグレードすることは可能ですか?

nif ライブラリがあり、再コンパイルするたびに、シェルを再起動してこのライブラリをリロードまたはアップグレードする必要があります。

これが私のアーランコードです:

erlang モジュールをコンパイルするたびに、次のエラーが発生します。

関数を呼び出すとinit/0、次のエラーが発生します。 {error,{reload,"Reload not supported by this NIF library."}}

この問題を修正して、シェルを再起動せずに新しい nif ライブラリをロードする方法はありますか?

0 投票する
1 に答える
542 参照

erlang - NIF から Erlang 関数を呼び出す

NIF から Erlang 関数 (コールバック関数) を呼び出すことは可能ですか?

ドキュメント ( http://www.erlang.org/doc/man/erl_nif.html ) を読みましたが、その方法が見つかりませんでした。

0 投票する
1 に答える
279 参照

c - Unicode 照合 NIF の実行は Pure Erlang 実装よりも遅い

既存の Unicode 照合ライブラリ (Erlang で記述) を NIF 実装として書き直して最適化しようとしています。主な理由は、照合が CPU を集中的に使用する操作であるためです。

実装へのリンク: https://github.com/abhi-bit/merger

Pure Erlang ベースの優先キューによる 1M 行の Unicode 照合:

NIF ベースの二項ヒープによる 1M 行の Unicode 照合:

これは珍しいことです。おそらく最大 10 倍高速になると予想していました。

オンにしましたがeproffprofNIF モジュールに関してはあまり役に立ちません。以下はeprof、主要な機能について述べたものです。

動的配列を使用したバイナリヒープに基づくユニコード照合の純粋な C 実装があり、はるかに高速であるため、NIF 実装を高速化できると確信しています。

私がここに持っている具体的な質問:

  • Erlang <-> NIF モジュールでの C 通信により、どれくらいの速度低下が予想されますか? この場合、純粋な C と NIF の実装の間で速度がおそらく 30 倍以上になります。
  • この場合のように、NIF 関連のスローダウンをデバッグするのに役立つツールは何ですか? 関数呼び出しを確認するために使用perf topしてみましたが、上位のもの (一部の 16 進アドレスが表示されていました) は「beam.smp」からのものでした。
  • NIF を最適化するために検討すべき領域は何ですか? 例: Erlang から C へのデータ転送、およびその逆のデータ転送を最小限に抑える必要があると聞いたことがありますが、他に考慮すべき領域はありますか?
0 投票する
1 に答える
480 参照

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同じサイズですか?

0 投票する
1 に答える
148 参照

c - Erlang nif がアップグレードされない

nif私はアーランでライブラリを書いています。loadまた、関数upgradeも書きunloadます。

これは私のコードです:

erlang シェルでこれをロードして関数nifを実行checksumすると、戻り123、すべて問題ありません!

その後、戻り値をchecksumto に変更し、コマンドを使用して to erlang vm を123456コンパイルしてロードします。nifl(mynif)

これが問題です!関数を実行checksumすると、戻り値はそうでなければなりませんが123445、まだアップグレードされていません。123nif

何が問題ですか?私はよく検索し、いくつかの例とライブラリをテストしましたjiffyが、うまくいきませんでした。

0 投票する
1 に答える
259 参照

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 を取得したため、送信に失敗しました。任意のアイデアをお願いします?