這是使用 Rust 和 WebAssembly 且未發佈的文件,發佈文件可於 Rust 和 WebAssembly 文件主站台取得。這裡所記載的功能可能不適用於 Rust 和 WebAssembly 工具發佈的版本中。

時間設定檔

此一節描述如何設定檔使用 Rust 和 WebAssembly 的網頁,目標是改善傳輸量或延遲。

⚡設定檔時務必確保您使用的是最佳化建置!wasm-pack build 預設會以最佳化方式建置。

可用工具

window.performance.now() 定時器

performance.now() 函式傳回以毫秒為單位的單調時間戳記,自網頁載入後開始計時。

呼叫 performance.now 幾乎沒有負擔,因此我們可以從中建立簡單、詳細的測量,而不致扭曲系統其餘部分的效能,或讓我們的測量產生偏差。

我們可以使用它來計時各種運作,我們可透過web-sys 箱子存取 window.performance.now()


# #![allow(unused_variables)]
#fn main() {
extern crate web_sys;

fn now() -> f64 {
    web_sys::window()
        .expect("should have a Window")
        .performance()
        .expect("should have a Performance")
        .now()
}
#}

開發人員工具 Profiler

所有網路瀏覽器內建的開發人員工具都包含一個 Profiler。這些 Profiler 會顯示哪個函式花費最長時間,其中包含常見的視覺化功能,如呼叫樹狀圖和火焰圖。

如果你用偵錯符號建立,以便在 wasm 二進位檔中包含「名稱」自訂區段,Profiler 應會顯示 Rust 函式名稱,而不是不透明的內容,如 wasm-function[123]

請注意,這些 Profiler 不會 顯示內聯函式,且由於 Rust 和 LLVM 大量依賴於內聯,所以結果可能會有些令人困惑。

Screenshot of profiler with Rust symbols

資源

console.timeconsole.timeEnd 函式

console.timeconsole.timeEnd 函式 允許你在瀏覽器開發人員工具主控台中記錄命名操作的計時。在操作開始時呼叫 console.time("some operation"),在操作結束時呼叫 console.timeEnd("some operation")。用於命名操作的字串標籤是選用的。

你可以透過 web-sys crate 直接使用這些函式

以下是瀏覽器主控台中 console.time 記錄的螢幕擷取畫面

Screenshot of console.time logs

此外,console.timeconsole.timeEnd 記錄會顯示在瀏覽器 Profiler 的「時間軸」或「瀑布」檢視中

Screenshot of console.time logs

#[bench] 與原生程式碼搭配使用

我們通常可以藉由編寫 #[test] 而非在網路中偵錯,來善用作業系統的原生程式碼偵錯工具。類似地,我們也可以透過編寫 #[bench] 函式來善用作業系統的原生程式碼剖析工具。

在 Crate 的 benches 子目錄中撰寫基準測試。請務必讓你的 crate-type 包含 "rlib",否則基準測試二進位檔將無法連結你的主程式庫。

但是!在耗費大量精力剖析原生程式碼之前,請務必了解瓶頸是否在於 WebAssembly 中!使用瀏覽器的 Profiler 來確認這一點,否則你可能會浪費時間去最佳化沒有問題的程式碼。

資源