MvvmCross:IoC和ServiceLocation性能

Aga*_*gat 4 c# mobile mvvmcross xamarin

我已经看了http://slodge.blogspot.co.uk/2013/06/ioc-and-servicelocation-in-v3-brain-dump.html这篇关于"v3中的IoC和ServiceLocation"的文章.

一切都很清楚.但是,这个逻辑性能是什么?通常反射被用于这种类型的东西(我假设MvvmCross也这样做).每个人(至少,或多或少经验丰富的开发人员)都知道反思是表演的"邪恶".

所以,据我所知,该框架遍历应用程序中的所有类(可能只是Core assemply)并找到需要注入的类等,对吧?我确信这在小项目中是可以的,对于像web这样的项目(长时间启动)也是不够的,但是有什么关于移动应用程序(通常具有更有限的处理器能力和启动时间对用户来说至关重要) ?你对此有什么想法吗?您如何评估" 开发的便利性 "和" 第一次降低性能 " 之间的关系?

谢谢.

Stu*_*art 19

一般答案

MvvmCross的绩效理念是:

  • 我们使开发更方便,以便开发人员可以制作更多令人愉快的应用程序
  • 我们知道平台的某些部分会增加一定的开销 - 但我们已经努力确保它不是一个大的开销
  • 我们为开发人员提供了构建分离视图,视图模型和组件的工具 - 我们认为这允许开发人员编写更高效,更健壮的组件
  • 因为我们允许开发人员构建分离的组件,然后如果/当他们遇到性能问题时,我们相信这使他们能够更好地优化他们需要的地点和时间.
  • 因为我们提供了一个重用的平台,我们相信开发人员将能够更好地开发和使用更好的组件 - 例如,因为开发人员可以重用我们的表/列表适配器,而不必在每个应用程序中修复和优化新的表/列表适配器
  • 我们努力确保几乎所有内容都可以在平台中覆盖,以便您可以在以后优化 - 如果您的应用程序想要手动调整IoC注册 - 您的应用程序不必使用反射.
  • 我们认为.Net(Microsoft和Mono版本)也有助于通过以下方式提高应用程序的性能:
    • 高效的内存管理
    • 像linq和TPL这样的图书馆
    • TPL与await/async等编译工具相结合
    • 在需要时通过PInvoke提供本机访问

当然,如果您绝对需要达到<200kB的包装尺寸限制,您将无法使用MvvmCross; 当然,即使使用世界上最好的工具,开发人员仍然可以制作性能不佳的应用......但我们将MvvmCross定位为帮助优秀的开发人员制作令人愉悦的跨平台应用.


技术要点

有限的处理器能力

现代移动平台具有:

  • 2到8个CPU内核,每个内核运行> 1GHz
  • 1 + GB的快速RAM
  • 16 + GB的超快存储(Flash)

这几乎没有限制 - 它比10年前的PC更快,更强大.


每个人......知道反思是表演的"邪恶"

对不起 - 我认为你不对.

与我合作的人都知道Reflection引入了一小部分开销,但它并不会影响我们的性能考虑因素.

我更赞同Donald Knuth说:

"我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源"

来自http://en.wikipedia.org/wiki/Program_optimization

在具有许多版本的应用程序/项目/产品中尤其如此 - 在紧密耦合的项目中,为v1创建的小优化通常会在达到v10或v11时导致严重的性能问题,其中平台中的更改会导致"旧代码"以"新模式"执行.


如果有人真正进入微优化,那么值得注意的是MvvmCross使用许多标记为虚拟的方法,许多小接口/对象和使用"{0} {1}"类型模式的字符串格式化 - 所有这些都可以如果有人真的想要优化.