[TOOLS] 7 分鐘閱讀OraCore 編輯部

Copilot Studio 換上 .NET 10 WASM 後更快了

Copilot Studio 把瀏覽器端 WebAssembly 引擎升到 .NET 10,帶來更快執行、較少部署雜活,還公開了實測數字。

分享 LinkedIn
Copilot Studio 換上 .NET 10 WASM 後更快了

Copilot Studio 把瀏覽器端 WebAssembly 引擎升到 .NET 10,執行速度變快,部署流程也少了幾段手工處理。

說真的,這種升級很實在。Microsoft 把 .NET 10 用到 Copilot Studio 的瀏覽器端 WebAssembly 引擎上,而且已經上線到正式環境。這代表 C# 直接跑在瀏覽器裡,啟動時間、下載大小、快取處理,都會直接影響使用者手感。

官方還丟出幾個很具體的數字。套件體積約增加 15%,第一次 AOT 呼叫快了約 20%,之後的 warm call 也快了約 5%。對開發者來說,這種數字比空話有用多了,因為它直接反映出取捨。

指標.NET 8.NET 10
JIT 與 AOT 共用檔案數5922
套件大小變化基準約增加 15%
第一次呼叫執行基準約快 20%
後續呼叫執行基準約快 5%
快速區網 AOT 下載基準約慢 200 毫秒
4G 網路 AOT 下載基準約慢 5 秒

這次升級到底改了什麼

訂閱 AI 趨勢週報

每週精選模型發布、工具應用與深度分析,直送信箱。不定期,不騷擾。

不會寄垃圾信,隨時可取消。

這次遷移其實很單純。根據 .NET Blog 的說法,Copilot Studio 團隊主要就是改專案目標框架,然後確認相依套件都能相容。講白了,就是把專案從 .NET 8 換到 .NET 10,再重建、上線。

Copilot Studio 換上 .NET 10 WASM 後更快了

這種做法很重要,因為 WebAssembly 專案很容易越做越肥。你一旦自己寫了快取清理、檔名雜湊、完整性驗證,下一次框架升級就可能又要補一堆補丁。Copilot Studio 這次的做法,是盡量吃進 .NET 10 的預設能力,少背自己維護的包袱。

我覺得這才是重點。很多團隊在意效能,卻忽略部署成本。結果效能只贏一點點,維運卻多一倍。Copilot Studio 的案例剛好反過來,它把一些手工流程交給框架處理了。

  • 原本就是跑在 .NET 8。
  • 新版已經正式上線。
  • 原有快取邏輯仍然保留。
  • 沒有重寫整個應用架構。

自動指紋化,少寫一堆部署雜活

.NET 10 對 WebAssembly 最有感的改動之一,是發佈資產自動 fingerprinting。白話一點,就是建置系統會自動在檔名裡加上唯一識別,快取更新和完整性檢查就不用自己拼命補腳本。

在舊流程裡,Copilot Studio 需要先讀發佈清單,再把檔案改成 SHA256 雜湊名稱,最後還要從 JavaScript 傳完整性資料去載入資源。這些事不是不能做,但很煩,而且很容易壞。升到 .NET 10 之後,這些步驟少了很多。

Microsoft.NET WebAssembly runtime 也把這套流程整合進去。資源可以直接載入,檔名會自動指紋化,完整性驗證也交給平台處理。這種事看起來不起眼,但對長期維護很有差。

“Moving an existing .NET 8 WASM application to .NET 10 is largely a matter of updating the target framework in the .csproj files and ensuring all dependencies are compatible with the new version.” — Daniel Roth, Principal Product Manager, Microsoft

這句話很直白,也很有份量。它的意思是,框架開始把原本要靠團隊自己補的東西收回去。你少寫幾段自訂腳本,日後少踩幾次雷。

另外還有一個小細節。若你把 .NET WASM runtime 放進 WebWorker,初始化時要設 dotnetSidecar = true。這種設定看起來瑣碎,但常常就是你卡住的地方。

AOT 變更,重點其實不是變大一點

另一個值得注意的改動,是 WasmStripILAfterAOT 在 AOT 建置下預設開啟。意思很簡單。方法一旦先編譯成 WebAssembly,原本的 IL 在執行時就不需要了,所以 .NET 10 會自動把它剝掉。

Copilot Studio 換上 .NET 10 WASM 後更快了

Copilot Studio 用的是混合策略。JIT 先讓使用者快速互動,AOT 再在背景處理比較重的工作。這樣做的好處很明顯,就是先讓介面動起來,再慢慢把重活接上去。使用者不會傻等整包 AOT 下載完。

這裡的數字很值得看。JIT 和 AOT 共用的檔案數,從 .NET 8 的 59 個降到 .NET 10 的 22 個。這代表重複內容少了,分工更清楚,但也讓套件體積增加一些。

  • 共用檔案數從 59 降到 22。
  • 套件體積約增加 15%。
  • 第一次呼叫約快 20%。
  • 後續呼叫約快 5%。

如果只看下載時間,這看起來像是退步。但要放在使用情境裡看。Microsoft 提到,在快速區網上,AOT 下載大約慢 200 毫秒;在 4G 網路上,大約慢 5 秒。可是在這段時間裡,使用者已經可以先操作 JIT 版內容了。

所以這不是單純比大小。這是在比體感。對桌機使用者來說,背景多幾秒通常還能接受。對行動網路使用者來說,就要更仔細評估,但至少你拿到的是更快的執行速度。

這跟其他 WebAssembly 專案相比怎樣

如果拿一般 Blazor 或 WebAssembly 專案來看,Copilot Studio 的做法很像一個成熟團隊該做的選擇。它不是追求最小下載,而是把部署複雜度和執行速度一起算進去。這才符合真實產品,而不是 demo。

很多團隊卡在自訂資產流程。你可能有自己的檔名雜湊、完整性驗證、CDN 快取規則,甚至還有一堆 shell script。這些東西一旦散落在 pipeline 裡,升版就會變成考古現場。Blazor WebAssembly 部署文件 一直都在提醒這件事:部署越標準化,維護成本越低。

再看競品思路。像 Emscripten 路線偏向把 C++ 生態搬進瀏覽器。WebAssembly 本身也不是只服務 .NET。可是 .NET 10 的優勢在於,它把常見的資產處理收進框架,讓 .NET 團隊少寫很多周邊邏輯。

  • .NET 10:自動 fingerprinting。
  • 舊流程:手工雜湊與完整性檢查。
  • JIT 先上,AOT 後補。
  • 適合需要互動優先的產品。

如果你是做內部工具,這種差異可能更明顯。內部工具常常要求快速上線,也常常沒人想維護一堆自訂腳本。這時候,框架內建能力就很香,因為它少掉很多人肉維護。

如果你是做面向大量行動使用者的產品,就要更小心。4G 多出 5 秒,不是小數字。你得自己量測,不能只看官方 benchmark。這點我會講得很直接,因為很多團隊最愛拿別人的數字當自己的結論。

這次升級透露的產業方向

這件事其實在講一個很現實的方向。WebAssembly 不再只是「能跑就好」,而是開始講求可維護、可部署、可長期迭代。框架如果能幫你處理資產命名、完整性驗證、AOT 剝離,團隊就能把時間花在功能本身。

對 Microsoft 來說,Copilot Studio 是很好的示範案例。它不是小玩具,而是實際產品。既然正式環境都能從 .NET 8 升到 .NET 10,代表這套路線已經夠穩,至少對某些工作負載是這樣。

更大的意義是,這會影響其他做 Blazor、WebAssembly、甚至內部平台的團隊。你如果還在維護自訂 hash 腳本、手動 integrity 檢查,現在就該拿 staging 環境試一次 .NET 10。別等到下一次大升版才發現自己欠一堆技術債。

接下來該怎麼看

我會把這次更新解讀成一個訊號。未來做 .NET WebAssembly 專案,標準化部署流程會比自己造輪子更重要。效能當然要看,但維護成本也要一起算,不然你只是把問題往後丟。

如果你手上有 Blazor 或其他 WASM 專案,建議先做兩件事。第一,升到 net10.0 測試。第二,量一下你自己的下載時間、第一次互動時間、後續呼叫時間。別只看平均值,因為行動網路和桌機的差很多。

講白了,這種升級最怕紙上談兵。你應該先在 staging 跑一輪,確認資產 fingerprinting、AOT 行為、WebWorker 初始化都正常,再決定要不要全面切換。這樣比較務實,也比較不會翻車。