【发布时间】:2021-03-11 02:53:24
【问题描述】:
我有一个已转换为 Blazor Wasm 的 c# WinForms 应用程序。在大多数用户输入之后,它需要执行一组 CPU 密集型计算(即没有 IO 或 UI 交互)。计算需要重复(30-50 次)调用一组 25-35 个 C# 类对象中的许多方法,具体取决于场景。相同的计算代码在 WinForms 和 Blazor 应用程序中运行。
我看到 Blazor 下的性能下降了约 20 倍(例如,WinForms 中的 350 毫秒与 Blazor 中的 7000 毫秒)。这种程度的退化有意义吗?它的很大一部分是在浏览器中运行所固有的吗? Blazor Wasm 在某种程度上是它的重要组成部分吗?我已经确认退化分布在计算中,而不是孤立的点。有什么方法可以显着减少退化?如果出于某种原因可能会有所帮助,可以将执行计算的对象放入类库中。
我已经在 GitHub 的 AspNetCore 讨论中发布了这个问题,但没有得到任何回复。我正在使用 VS Community 2019 v16.8.2、AspNetCore 5.0 和 Chrome v
谢谢。史蒂夫
【问题讨论】:
-
是的,这是预期的性能下降。 Blazor wasm 现在以解释器模式运行(尽管在不久的将来可能会发生变化),这意味着只有运行时本身被编译为 wasm。然后,运行时从您的 dll 下载并解释 IL,与将程序集直接编译为 WASM 的情况相比,这非常慢。很快它应该可以直接编译成 WASM,并且它应该会提供一些性能改进(尽管它无论如何都不会达到原生 .NET 应用程序的水平)
-
呃。我希望这不是答案。我有相当长的时间来等待编译被实现,但是这将有助于了解在改进之后与本机 .NET 相比有多少退化。慢 2-3 倍可能是可行的(可能有一些逻辑上的妥协),但 5+ 可能是一个阻碍。无论如何,谢谢你的观点。
-
很难说(对我来说)这将实现什么加速,可能确实会慢 3 倍。但是,Blazor wasm 也不支持多线程,尽管 WASM 本身支持(至少在某些浏览器中,最终会有更多的浏览器支持它)。虽然直接编译到 wasm 即将到来 - 我不知道在不久的将来有任何关于多线程的计划。对于 CPU 密集型计算,可能会为原生 .NET 提供更多功能。
-
我意识到这是几周前的事了,但我想我会检查你的计算是否涉及任何异步调用——你在等待什么吗?您在计算期间是否更新 UI?您是否正在消除用户输入的抖动,以防止计算在单个线程上通过异步同时运行?
-
计算没有按照您的要求进行。纯cpu处理。有一个实例化的单例,它通过调用一组大约 40 个对象中的各种方法来控制计算。所有这些对象都会在启动时实例化,并在每次需要进行新一轮计算时重复使用。
标签: c# visual-studio asp.net-core blazor webassembly