輕巧高效能WebAssembly Runtime Wasmtime將在9月20日迎來1.0正式版,在發布前夕,WebAssembly聯盟Bytecode Alliance發布部落格文章,介紹Wasmtime 1.0所應用的加速技術。這些最佳化工作,使編譯器Cranelift能夠生成更快速的程式碼,也使得Cranelift本身能高速運作,Wasmtime因而能夠更快地實例化已編譯的模組,並且在模組開始執行後保持Wasmtime高效運作。

Wasmtime是建立在編譯器Cranelift之上的WebAssembly Runtime,當Wasmtime在執行Wasm程式的時候會執行兩部分的工作,分別是CPU執行從Wasm二元組碼編譯而來的原生指令,以及執行維護資料結構和實作Wasm語義的Wasmtime Runtime,這兩部分工作分別對應到Cranelift和Wasmtime,以及個別的初始階段以及穩態執行階段。

而Bytecode Alliance透過加速編譯器和Runtime的各項工作,來大幅加速Wasmtime的整體執行速度。

其中Wasmtime的初始階段,也就是實例化Wasm模組的速度,則是加速的關鍵之一。Wasm模組實例間相互隔離,是Wasm程式維持安全的重要方法,Wasm模組的每個實例都有自己的狀態,實例的狀態不會相互影響,為了讓隔離更加有效率,部分Wasm應用程式會將每個工作單元,像是伺服器上傳入的請求,實例化成一個新實例。

而這種細緻的隔離,也代表著每個處理單元觸發的錯誤,不會影響後續單元,每個工作單元都會從一個明確定義的狀態開始,而且錯誤的影響半徑,或是存在的潛在損害都是有限的。

因此極快的模組實例化是Wasmtime的關鍵要求,官方提到,他們在過去一年間,針對這項工作進行了大量的最佳化,將模組實例化從毫秒等級加速至微秒等級,在實際的SpiderMonkey.wasm案例中,實例化時間從原本的2毫秒縮減成5微秒,快了400倍。

官方也針對Cranelift進行效能改進,最重要的工作是大幅改造暫存器分配器regalloc2。暫存器分配器是編譯器的一部分,功能是將儲存位置分配給程式中的值,當暫存器分配器能夠良好地決定儲存在暫存器中的數值,就能因為夠少的數值移動,大幅提升程式效能。Regalloc2則應用了更進階的演算法,來決定暫存器分配值的方法,在導入regalloc2之後,SpiderMonkey.wasm的執行時效能提升約5%。

官方透過最佳化Wasmtime和Cranelift來提升Wasm程式的執行速度,Bytecode Alliance提到,WebAssembly要能夠成功,就需要加速執行的工具,才能夠與原生程式競爭。

熱門新聞

Advertisement