簡體   English   中英

CPU 密集型計算需要 Blazor Wasm 性能改進

[英]Need Blazor Wasm Performance Improvement on CPU Intensive Calculations

我有一個 c# WinForms 應用程序,我已將其轉換為 Blazor Wasm。 在大多數用戶輸入后,它需要執行一組 CPU 密集型計算(即沒有 IO 或 UI 交互)。 計算需要重復(30-50 次)調用一組 25-35 個 C# class 對象中的多個方法,具體取決於場景。 相同的計算代碼在 WinForms 和 Blazor 應用程序中運行。

我看到 Blazor 下的性能下降了約 20 倍(例如,WinForms 中的 350 毫秒與 Blazor 中的 7000 毫秒)。 這種程度的退化有意義嗎? 它的很大一部分是在瀏覽器中運行所固有的嗎? Blazor Wasm 在某種程度上是它的重要組成部分嗎? 我已經確認退化分布在計算中,而不是孤立的點。 有什么方法可以顯着減少退化? 如果出於某種原因可能會有所幫助,可以將執行計算的對象放入 class 庫中。

我已經在 GitHub 的 AspNetCore 討論中發布了這個問題,但沒有任何回應。 我正在使用 VS Community 2019 v16.8.2、AspNetCore 5.0 和 Chrome v

謝謝。 史蒂夫

這是對這個問題的一個很晚的回應,但是 web 工作人員會幫助解決這個問題嗎? 這應該會帶來一些多線程功能。 我不能說自己實現這個,但這里有一個幫助庫,似乎很容易將它帶入 Blazor:

https://github.com/Tewr/BlazorWorker

在本機 JavaScript 中,您可以通過Navigator Api訪問瀏覽器的核心數:

 const coreCount = window.navigator.hardwareConcurrency; console.log(`Your computer has ${coreCount} cores;`);

Blazor Wasm 不支持多線程 + 鼠標事件處理等頻繁操作對於在瀏覽器中進行處理非常“繁重”。 嘗試將操作處理程序推送到隊列中並在后台處理它們。

如果您有 .NET 后端,則可以輕松地在那里執行代碼。 只需幾毫秒的開銷,您就可以獲得與以前幾乎相同的性能。 雙方使用相同語言的好處之一。

Blazor 現在支持將整個代碼庫提前 (AOT) 編譯為 WASM,而不僅僅是運行時。 此選項僅在發布版本中可用。 (請參閱: https://docs.microsoft.com/en-us/aspnet/core/blazor/host-and-deploy/webassembly?view=aspnetcore-6.0 )這提高了運行 Z30F35E630DAF44DBFA4C3F68F5399D8CZ 的先前 model 的性能在 WASM 解釋器中,它仍然是 Debug 構建中的 model。

Blazor 有兩種托管模型:Blazor 客戶端和 Blazor 服務器 Z20F35E630DAF44DBFA4C3F68FZ3。 此處的詳細信息: Blazor 托管模型如果您使用 Blazor 客戶端,我預計會出現這種退化,但不會期望在 Blazor 服務器中出現這種情況。

如果它是純計算的,那么為什么不使用 WASM 語言(例如 Rust)並從 JavaScript 調用它? 正如約瑟夫指出的那樣,您還可以使用服務器端 Blazor 或簡單地調用 web 服務端點。

將在瀏覽器中運行的程序與在操作系統中本地運行的程序進行比較可能是不公平的。 我寧願將 Blazor 與 JavaScript 進行比較,因為它們都在瀏覽器上運行。 可以在瀏覽器中運行的程序的優勢在於它可以在大多數設備上運行,從 PC 到大多數手機。 此外,它是一種 MSIL 形式,比 JavaScript 更難逆向工程。 但是,要付出代價,那就是性能(Mono -> WASM -> Native 中的 MSIL)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM