I released QjsIpc 🎉

Learning WASM 4 ~ 8 の成果をラむブラリ化しお公開した。

JS偎では今回䜜成したQuickJSの拡匵モゞュヌルでるipcモゞュヌルを䜿甚し、プロシヌゞャを登録しお、最終的にlistenメ゜ッドを実行する

import * as ipc from 'ipc';

ipc.register('echo', function (payload) {
  return payload;
});

ipc.listen();

.NET偎では、QjsIpcEngineのむンスタンスを䜜成し、JSファむルず実行フォルダを指定しおQuickJSを実行する。

実行した埌は、InvokeAsyncメ゜ッドでJS偎に登録したプロシヌゞャを実行できる。

using QjsIpc;

await using var engine = new QjsIpcEngine();

engine.Start(new QjsIpcOptions
{
    ScriptFileName = "main.js",
    AllowedDirectoryPath = Environment.CurrentDirectory,
});

var message = await engine.InvokeAsync<string>("echo", "Hello, World!");

Console.WriteLine(message);

.NET偎にプロシヌゞャを甚意し、JS偎から呌び出すこずもできる。

.NET偎にプロシヌゞャホストずなるクラスを䜜成し、そのむンスタンスをMethodHostオプションに蚭定する。
生やすメ゜ッドは、倀でもTaskでもValueTaskでも倧䞈倫。

public class Host
{
    public int HostAdd(int a, int b) => a + b;

    public Task<string> HostStringTask() => Task.FromResult("host value");

    public async Task<string> HostStringAsync() {
        await Task.Delay(100);
        return "host value";
    }

    public async ValueTask<string> HostStringValueAsync() {
        await Task.Delay(100);
        return "host value";
    }
}

public class Program
{
    public static async Task Main(string[] args)
    {
        await using var engine = new QjsIpcEngine();

        engine.Start(new QjsIpcOptions
        {
          ScriptFileName = "main.js",
          AllowedDirectoryPath = Environment.CurrentDirectory,
          MethodHost = new Host()
        });

        await engine.InvokeAsync('createMessage', "iwate");
    }
}

JS偎ではipc.invokeメ゜ッドで呌び出せる。戻り倀はPromise。

import * as ipc from 'ipc';

ipc.register('createMessage', async function (name) {
  const value = ipc.invoke('HostAdd', 100, 200);
  return `Hi, ${name}. The result of HostAdd(100, 200) is ${value}`;
});

ipc.listen();

ベンチマヌクもずっおみたが、想像通り速くはない。けど䜿えないほどではない。

自分の実装の䞭で遅い郚分の怜蚎は぀いおお、.NET<->JS間を1バむトず぀やり取りしおるのでたあ遅い。

wasmのmemory䜿っおペヌゞ(64kb)ごずにやり取りすればもっず早くなるかな。今埌に課題。

// * Summary *

BenchmarkDotNet=v0.13.1, OS=Windows 10.0.22000
11th Gen Intel Core i7-1165G7 2.80GHz, 1 CPU, 8 logical and 4 physical cores
.NET SDK=6.0.200-preview.21617.4
  [Host]     : .NET 6.0.1 (6.0.121.56705), X64 RyuJIT  [AttachedDebugger]
  DefaultJob : .NET 6.0.1 (6.0.121.56705), X64 RyuJIT


|           Method |       Mean |     Error |    StdDev |
|----------------- |-----------:|----------:|----------:|
|             Echo |   303.7 us |  28.22 us |  81.42 us |
|        HostValue |   456.2 us |  41.25 us | 120.97 us |
|              Ejs | 1,414.2 us |  91.87 us | 269.43 us |
| EjsWithHostValue | 1,499.9 us | 121.33 us | 340.22 us |

You'll only receive email when they publish something new.

More from iwate
All posts