设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 IT综合资讯 查看内容

C++/CX性能陷阱

2013-11-1 09:40| 发布者: joejoe0332| 查看: 9919| 评论: 0|原作者: Jonathan Allen|来自: infoQ

摘要:   使用C++/CX编写应用程序和编写正常的C++应用程序不一样。纯C++代码和Windows运行时(WinRT)之间的互操作性出奇的昂贵。基于Sridhar Madhugiri的视频 C++/CX 最佳实战中的内容,我们在本文中列举了一些在Windows ...


  集合


  与C++中常见的集合相比,WinRT中的集合是非常昂贵的。和.NET中可观察的集合一样,对WinRT集合的每一次修改都会产生一个通知。该通知主要用于XAML数据绑定以便于更新UI。


  在初始化期间避免这种损失的一种方式是,首先在堆栈上创建并填充一个标准的vector,然后使用move函数初始化一个platform vector。你能够这样做,因为标准的vector将会被销毁,同时它的动态内存无论如何都会被释放。


  在更新很多元素的时候,考虑使用ReplaceAll方法。这仅会触发一个通知而不是每一条记录一个通知。在WPF和Silverlight中没有与之相对应的方法,因为这些UI堆栈本身不支持一次性插入或者移除多个条目。


  WinRT集合中的另一种性能消耗来自于元素的读取。WinRT集合是以接口的形式暴露的,因此它们是虚的,这就意味着它们并不能像普通的函数那样被内联。此外,每一次读取都需要进行范围检查。所以如果你需要多次读取同一个值,考虑将它复制到一个局部变量中,不要每次都从集合中读取。实际上复制的缺点是,你必须复制值或者增加对象上的引用数,这是一个连锁操作。


  完全避免这种消耗的一种方式是在迭代集合之前复制它。分配一个正确大小的局部vector,然后在ArrayReference上使用GetMany函数。然后结合使用ReplaceAll方法,你就能够对集合进行几次迭代,仅需要跨越WinRT边界三次就能够做一系列复杂的修改。


  WinRT接口


  和传统的COM一样,在WinRT中一个对象的成员仅会通过接口暴露。你永远都不可能直接访问对象。C++/CX通过做必要的隐式转换对你隐藏了这些细节。这样做之所以必要的一个常见原因是,可以满足调用非默认接口上的方法时的需要。


  WinRT中的转换不是廉价的。它需要调用QueryInterface这个虚方法,同时有一个增加引用数的连锁操作。一旦完成了对非默认接口的调用,还需要另一个减少引用数的连锁操作。


  类库作者:


  确保类中所有的常用方法在默认接口上都是可用的,这样就不需要转换成另一个接口了。


  如果要对同一个非默认接口进行多次调用,那么创建一个该接口类型的局部变量。这样仅需要执行一次转换,而不是每次方法调用时都做一次转换。


  类


  在任何可能的时候你都应该使用堆栈分配或者unique_ptr类。因为这样你将获得所有选项的最好性能。


  在你确实需要一个复杂生命周期的时候,你的下一个选择是通过一个shared_ptr访问的普通C++类。这种方式和上面选项之间的主要区别在于引用数开销。


  你选择的最后一种手段应该是ref类。一个ref类拥有和shared_ptr相似的引用数语义,但是能够带来其他基于WinRT的开销。所以仅在需要将类传递到一个WinRT函数或者在XAML的数据绑定中使用ref类。


  在使用ref类的时候,尽量保持较浅的继承层次。WinRT继承和C++继承不一样,它有额外的开销。


  XAML数据绑定


  在WinRT+XAML数据绑定中你应该避免实现INotifyPropertyChanged,除非你确实希望在属性被填充之后发生改变。同样的,不要暴露公共set函数,除非UI确实需要修改数据。


  XAML所调用的get函数应该是廉价的。不仅仅是因为它们是在UI线程上被调用的,还因为我们可能会调用它们多次。所以不要在get函数中分配内存或者执行昂贵的计算。


  对于所有基于XAML的UI(WPF、Silverlight、WinRT+XAML)而言,一点非常重要的建议是保持较浅的数据层次。绑定表达式中的每一个点都代表了一次属性改变事件,而为了保持屏幕及时更新数据绑定引擎必须监听这些事件。


  关于作者


Jonathan Allen 从2006年开始就一直在为InfoQ编写新闻,现在是.NET版块的首席编辑。如果你有兴趣为InfoQ撰写新闻或者教育性的文章,那么请联系他:jonathan@infoq.com.

 

  查看英文原文C++/CX Performance Pitfalls


酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部