Vergleich von nativer Mehrthreaded-JavaScript- und WASM-Performance

Schriftsteller:Der Erfinder quantifiziert, Datum: 2023-02-23 17:35:24
Tags:Mehrfächer

Die Erfinder haben versucht, von der nativen Unterseite aus zu quantifizieren, dass Javascript wirklich sinnvolle Multi-Threads unterstützt, und haben die WASM-Funktion hinzugefügt. Diese Funktion ist eine nicht-Javascript-basierte Funktion, die von mehreren Themen verwendet wird, um miteinander oder mit dem Hauptthemen zu kommunizieren.

Die C-Sprache Transwasm kann auf dieser Website getestet werden:https://wasdk.github.io/WasmFiddle/

Der C-Code, der als wasm kompiliert wurde, ist folgender:

int fib(int f) {
  if (f < 2) return f;
  return fib(f - 1) + fib(f - 2);
}

Kompiliert, heruntergeladen und in Python in eine Hex-String umgewandelt

python -c "print('data:hex,'+bytes.hex(open('program.wasm','rb').read()))"

Die Variablen in der Code werden durch den Inhalt ersetzt, der hinter der Variable steht.

__Thread ((Funktion, Argumente...)

Erstellt einen Thread und gibt den Threadtid zurück, die Funktion der akzeptierten Thread-Hauptfunktion muss alle Funktionscodes innerhalb der Thread-Funktion abschließen, unterstützt keine Verweise auf andere Schließfunktionen, kann alle Plattform-APIs innerhalb des Threads aufrufen, aber keine anderen benutzerdefinierten Funktionen aufrufen

Ein einfaches Beispiel:

let tid = __Thread(function(x, y) {
    return x + y
}, 1, 2)
Log(__threadJoin(tid))

Ein Beispiel für eine Mehrthread-Anfrage:

function main() {
    let threads = [
        "https://www.baidu.com",
        "https://www.163.com"
    ].map(function(url) {
        return __Thread(function(url) {
            Log("GET", url)
            return HttpQuery(url)
        }, url)
    })
    threads.forEach(function(tid) {
        Log(__threadJoin(tid))
    })
}

Lokal gespeicherte Variablen

Unterstützt die lokale Speicherung von Variablen, um Daten zu teilen, die nicht in einem Thread gespeichert werden.__threadJoinErwarten Sie eine erfolgreiche Abreise oder__threadTerminateWirksam bei Beendigung

__threadGetData(tid, key)
__threadSetData(tid, key, value)

tid ist 0 für den aktuellen Thread, value ist nicht angegeben für den Löschschlüssel, unterstützt die gegenseitige Zugriff auf gemeinsame Variablen zwischen Threads, die Werte müssen sich sortieren lassen

Funkkommunikation

__threadPostMessage(tid, msg) // 向指定线程发送消息, tid为0是向主线程即当前主函数发送, 在线程内部调用指向主线程回复消息, 该消息可以被EventLoop捕获
__threadPeekMessage(tid, timeout) // 从指定线程接收消息, 如果不指定timeout(毫秒)就一直等待, tid为0指等待主线程的消息

Ich bin nicht derjenige.

Warten Sie bis zum Ende des Threads, geben Sie eine timeout (millisekunden) an, die nicht angegeben werden kann, also warten Sie bis zum Ende des Threads, erfolgreich eine Struktur zurückgeben, die einen Funktionswert enthält, und die Ressourcen zurückgewinnen, wie folgt:

{
    id: tid, // 线程id
    elapsed: 1111, // 线程的运行时间(纳秒)
    terminated: false, // 线程是否被强制结束 
    ret: 123, // 线程函数的返回值
}

Wenn die Überstunden undefined zurückgeben

_threadEnde ((zeit)

Zwangsendung von Threads und Rückgewinnung von Ressourcen ((kann nicht mehr _threadJoin verwenden, bis Ende)

Vorsicht.

Die __Thread-Funktion unterstützt keine Variablen außerhalb der Referenzfunktion.


function main() {
    let cycle = 100
    let input = 30
    let threads = [
        __Thread(function(cycle, input) {
            function fib(f) {
                if (f < 2) return f
                return fib(f - 1) + fib(f - 2)
            }
            let ret = 0
            for (let i = 0; i < cycle; i++) {
                ret = fib(input);
                Log("javascript progress: ", i)
            }
            return 'javascript fib: ' + ret
        }, cycle, input),
        
        __Thread(function(cycle, input) {
            let data = 'data:hex,0061736d010000000186808080000160017f017f0382808080000100048480808000017000000583808080000100010681808080000007908080800002066d656d6f727902000366696200000aa480808000019e80808000000240200041024e0d0020000f0b2000417f6a10002000417e6a10006a0b'
            let m = wasm.parseModule(data)

            let instance = wasm.buildInstance(m, {
                stack_size: 65 * 1024 * 1024,
            })

            let ret = 0
            for (let i = 0; i < cycle; i++) {
                ret = instance.callFunction('fib', input)
                Log("wasm progress: ", i)
            }

            return 'wasm fib: ' + ret
        }, cycle, input)
    ]

    threads.forEach(function(tid) {
        let info = __threadJoin(tid)
        Log('#'+tid, info.ret, 'elapsed:', info.elapsed / 1e6, "#ff0000")
    })
}

Verwandt

Mehr

Das KnochenmesserHinweis: Fehler ReferenceError: '__Thread' ist nicht bei main definiert (FILE:5)

Der Erfinder quantifiziertUpgrade auf den neuesten Administrator