【问题标题】:Won't performance take a hit with the MVVM Light toolkit?MVVM Light 工具包不会影响性能吗?
【发布时间】:2026-02-21 00:05:01
【问题描述】:

我一直在使用流行的 MVVM Light 工具包:here 来创建我的 Windows Phone 应用程序,并且对这种模式有疑问。对于创建的每个页面,我们都会创建一个新的视图模型,以保持代码干净并促进关注点分离。但是 ViewModelLocator 的构造函数包含每个视图模型的实例化。

ViewModelLocator 的构造函数通常如下所示:

public ViewModelLocator()
    {
        ////if (ViewModelBase.IsInDesignModeStatic)
        ////{
        ////    // Create design time view models
        ////}
        ////else
        ////{
        ////    // Create run time view models
        ////}

        CreateMain();
        CreatePage2();
        CreatePage3();
        CreatePage4();
    }

如果应用程序包含一堆页面,即使对于那些可能永远不需要的视图也不会实例化每个 ViewModel 会导致性能问题?

我错过了什么吗?

【问题讨论】:

    标签: silverlight windows-phone-7 mvvm


    【解决方案1】:

    如果有任何开销或对性能有任何顾虑,最好衡量一下开销/问题是什么。

    确实,当通过 .Net、C#、Silverlight、XAML、DataBinding 和 MVVMLight 对 WP7 进行编码时,您会插入大量“开销”——其中大部分开销是为了方便编码人员,而不是为了利益用户的。

    但是,WP7 CPU、视频协处理器、快速 RAM 和快速固态内存都非常快 - 因此存在一些开销空间,您可以使用这些框架来创建令人愉悦、响应迅速的 WP7 应用程序。

    无论如何都要担心性能问题 - 但最好通过衡量来消除这些问题,以找出需要优化的地方,或者需要在其他一些 UI 功能后面隐藏缓慢的地方。

    通常,当我测量时,我发现我的性能瓶颈不是我所期望的......我还发现总是有权衡 - 例如在您关心的问题中,权衡可能是虽然 Locator 构造代码运行速度较慢,但​​稍后的查找代码可以运行得更快 - 因此应用内导航可以更快,但启动时间会稍微慢一些。

    【讨论】:

    • 一个词,#perfmatters
    【解决方案2】:

    您不必在构造函数中显式创建对象。您可以将它们推迟到第一次访问它们。

    public MainPageViewModel MainPage
    {
      if(_mainPageViewModel == null)
      {
        _mainPageViewModel = CreateMain(); 
      }
      return _mainPageViewModel;
    }
    

    正如@Stuart 所说,无论如何都要衡量性能,但通常最好只为你需要的东西创建足够的东西。因此,最好将创建推迟到属性 getter。

    但是,如果视图模型的限制很重,那么您可以考虑在构造函数中进行向上构造,同时为用户提供进度条。同样,这取决于衡量性能,分析您的设计,看看什么最适合您的需求。

    【讨论】: