使用MVVM Light工具包会不会影响性能?

时间:2012-02-13 02:30:43

标签: silverlight windows-phone-7 mvvm

我一直在使用流行的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会导致性能问题吗?

我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:8)

任何开销或任何关于性能的问题,测量开销/问题是个好主意。

确实,当通过.Net,C#,Silverlight,XAML,DataBinding和MVVMLight对WP7进行编码时,你会插入大量的“开销” - 大部分开销都是为了方便编码器,而不是为了好处用户。

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

无论如何都要担心性能 - 但最好通过测量来推动这些问题,找出需要优化的地方,或者需要隐藏其他UI功能背后的缓慢的地方。

一般来说,当我测量时,我发现我的性能瓶颈并不是我所期望的......我也发现总会有权衡 - 例如在您关注的情况下,权衡可能是当Locator构造代码运行较慢时,后面的查找代码可以更快地运行 - 因此应用内导航可以更快,但代价是稍微慢一点的启动时间。

答案 1 :(得分:1)

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

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

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

但是,如果视图模型的收缩很重,那么您可以在构造函数中考虑upfrint构造,同时为用户提供进度条。这取决于,衡量绩效,分析您的设计,看看哪种最适合您的需求。