浅谈.NET Micro Framework性能优化 转自 软件中国
.NET Micro Framework的可剪裁性,高定执行,和天生对硬件高集成度都让它的前途一片光明。当然,它现在还很年轻,就发布的SDK v3.0来看,它还有很长的路要走。
废话不说,就这几个月我用下来的经验谈谈在针对.NET Micro Framework应用程序的性能优化吧。
1. 尽可能减少方法调用!
方法调用过于频繁对于性能的影响非常大,所以所有的优化都是以这个为大前提的。
2. 尽可能避免使用属性,而用公共域来代替。
因为编辑器会在编译的时候为每个属性的getter和setter添加访问方法,基于第一条,这是要避免地。
当然也不是说完全避免使用属性了,毕竟有的时候属性是很方便且必要的。
比如这个下面这个使用属性的例子
public class Test {
public string Name { get; set; }
}
需要把它改成这样:
public class Test {
public string Name;
}
3. 只在构造函数里面初始化变量。
这一条很容易明白,看下面的例子:
public class Test {
private string name = "Test String";
private DateTime date = DateTime.Now;
private int score, counter;
public Test() {
score = ;
counter = ;
}
}
初始化的工作其实进行了两次,一次是在声明变量的时候,另外一次是在调用构造函数的时候。遵循第一条原则,我们要尽可能减少方法调用,且构造函数的使用概率很高,所以我们在此需要把初始化的工作全部集中到构造函数里面来进行。
4. 只在必要的地方调用lock。
对于MF这样一个半实时的系统来说,lock的成本远远高于我们的想象。在.NET里面可能感觉不出来,但到了MF这个小伙子手里感觉就非常明显了,也许这一条大家已经知道了,就当我老调重弹吧。
看这个例子:
public class Test {
private ArrayList objs;
public void SomeMethod(object o)
{
for(int i = ; i < ; i++)
{
if (objs.Contains(o)) {
lock(objs.SyncRoot) {
objs.Remove(o); }
}
}
}
}
在一个循环里面增删一个集合,由于是多线程访问,所以在操作之前加了锁。之所以在循环内部加锁,理由可能是想尽可能的减少lock的访问次数,只有满足那个if条件的时候才会被调用。
实际上,这个想法错了,无论如何,这里的lock都会被调用很多次,这些开销加起来就会对性能造成很大的影响。
把代码改成这样就会好很多:
public class Test
{
private ArrayList objs;
public void SomeMethod(object o)
{
lock (objs.SyncRoot)
{
for (int i = 0; i < 100; i++)
{
if (objs.Contains(o))
{
objs.Remove(o);
}
}
}
}
}
5. 保证每个时间只有一个线程在运行。
用惯了.NET,来到MF世界第一个不适应就是它的多线程太慢了,如果同时打开两个线程工作,那么整个程序的效率都会受到极大的影响。
拿电子地图软件来做例子,主线程负责更新UI,工作线程负责在后台取得地图块。这样的设计本身无可厚非也是合理的,但最后我们发现性能实在太差了。
后来更改成为当用户在操作UI的时候,工作线程全都暂停,只有检测到用户没有任何操作的时候才进行工作。
要实现这一点,就要求程序在设计的时候就考虑到工作线程的可暂停性。
6. 尽可能少的并且在最小的范围内调用Invalidate()方法。
很多人在重画UI之后都会习惯性的调用顶层元素的Invalidate()方法来更新所有子控件,因为这样是最快捷的。可很多时候我们忽略了一点,Invalidate()这个方法可能在背后已经被调用过很多次了。
比如,有的控件会在得到焦点的时候调用这个方法,有的控件会在出发用户事件的时候自动调用这个方法。因为这些都是在背后发生的,我们可能并不知情,所以在完成我们自己控件的绘制之后通常会调用parent的Invalide来更新整个布局,这样就会在不知不觉之间导致了不必要的重画产生。
要避免这个问题也很简单,一则仔细观察,二则用Refactor!去阅读一下别人的代码。
7. 尽可能少的使用图片资源。
因为MF本身的数据吞吐量很小,如果载入过多图片资源的话,轻则程序运行效率变低,重则出现内存溢出。所以这里的原则我们要参照网页的设计原则,例如一个按钮图片,把它切割成几个小块,利用重复贴图来完成中间部分,而不要直接使用一整张图片。
同样在制作高亮的时候可以通过改变图片透明度或者在图片上面加一层透明矩形来实现。
8. 仅导入必要的字体资源。
这一点和上一条的理由是一样的,都是减少运行期间的数据吞吐量。对于英文来说还好,本来就不大,对于中文来说就很重要了,因为中文字体动辄就是几百k上兆,如果全部导入的话简直就是灾难。
最好就是程序用到多少就导入多少,实在没办法,就把生僻字全部剔出吧。
9. 窗体最好用完就是立即关闭。
这一点对于窗体很多的应用程序非常重要!在.NET的世界里,打开一个主窗体,然后在主窗体里面创建子窗体的做法非常常见。但这可能会成为你的MF程序运行效率最大的隐性杀手。
例如 主窗体 -> 产品列表 -> 产品详细信息 -> 产品操作窗口 -> 结算窗口
这是一个常见的逻辑线,此时一共有五个窗口被打看,如果你有时间尝试的话,会发现在打开结算窗口的时候,整个程序已经气喘吁吁,动弹不得了。
而且,因为MF的半实时性,导致GC在关闭窗口之后不能立即释放资源,如果用户反复打开关闭这些窗口,内存很快就溢出了。
所以实现一个窗口管理器非常重要,要确保每个时间只有一个窗口在运行。
10. 减少Timer的使用。
Timer也是性能消耗的大户,我曾见过一个程序里面打开了数十个Timer,那性能简直惨不忍睹。所以如果可能,保证整个程序只是用一个Timer,且只在必要的时候启动它,将会为你的程序减轻很多负担。
- .Net Micro数据的永久存储浅析在.Net Micro Framework中支持英文输入法详解.Net Micro实现SideShow窗体界面实例详解.Net Micro Framework平台移植初步在.Net Micro Framework中支持鼠标操作
【责任编辑:彭凡 TEL:(010)68476606】
浅谈.NET Micro Framework性能优化 转自 软件中国的更多相关文章
- 浅谈对Spring Framework的认识
Spring Framework,作为一个应用框架,官方的介绍如下: The Spring Framework provides a comprehensive programming and con ...
- 浅析Entity FrameWork性能优化
浅析EF性能优化 1. 数据Load 延迟加载:当实体第一次读取时,相关数据没有加载:当第一次试图访问导航属性时,所需的导航数据自动加载,EF默认使用这种方式加载数据,尽量使用预先加载和显 ...
- 27倍性能之旅 - 以大底库全库向量召回为例谈Profiling驱动的性能优化
问题 Problem kNN(k Nearest Neighbor)定义 给定一个查询向量,按照某个选定的准则(如欧式距离),从底库中选择
- 浅谈iOS中的视图优化
引言: 让我们来思考几个问题,你开发过的产品,它还有可以优化的地方吗?能增加它的帧率吗?能减少多余的CPU计算吗?是不是存在多余的GPU渲染?业务这点工作量对于越来越强大的设备面前显得微不足道,但作为 ...
- [转载] - Entity Framework 性能优化建议
1.对象管理机制-复杂为更好的管理模型对象,EF提供了一套内部管理机制和跟踪对象的状态,保存对象一致性,使用方便,但是性能有所降低. 2.执行机制-高度封装在EF中,所有的查询表达式都会经过语法分析. ...
- Entity Framework性能优化
AsNonUnicode 执行如下语句,并用SqlProfiler监控其SQL: var list = WMFactory.ReChargeMobile.Queryable().Where(w =&g ...
- 三分钟浅谈TT猫的前端优化
首先看一张访问TT猫首页的截图: 测试环境为谷歌浏览器,暂且不讨论其它浏览器,截图下方我们可以观察到以下参数: DOMContentLoaded:1.42s | Load:2.31s 以上参数是在CT ...
- 浅谈CDN技术的性能与优势
从淘宝架构中的CDN入手分析 使用CDN和反向代理提高网站性能.由于淘宝的服务器不能分布在国内的每个地方,所以不同地区的用户访问需要通过互联路由器经过不同长度的路径来访问服务器,返回路径也一样,所以数 ...
- 浅谈OI中的底层优化!
众所周知,OI中其实就是算法竞赛,所以时间复杂度非常重要,一个是否优秀的算法或许就决定了人生,而在大多数情况下,我们想出的算法或许并不那么尽如人意,所以这时候就需要一中神奇的的东西,就是底层优化: 其 ...
随机推荐
- 为C# Windows服务添加安装程序
最近一直在搞Windows服务,也有了不少经验,感觉权限方面确定比一般程序要受限很多,但方便性也很多.像后台运行不阻塞系统,不用用户登录之类.哈哈,扯远了,今天讲一下那个怎么给Windows服务做个安 ...
- windows 支持curl命令
curl 是一般linux发行版中都带有的小工具,利用这个工具可以很方便的下载文件, 我一般使用这个工具来查看某个页面相应的HTTP头信息,在Windows系统中我们也一样可以使用这个工具,如果不需要 ...
- Effective_java之二:慎用重载函数
每周写一篇技术博客的愿望一直没实现, 从这周開始每周五晚10点是写博客的时间 OOP的一个重要特性就是多态,实现多态的目的有多种途径.比方:重载overload.重写overwite.面向接口编程等等 ...
- mysql sort 性能优化
http://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html 这段时间mysql 数据库的性能明显降低,iowait达到了30, ...
- Session丢失,都是CDN惹的祸
周六下午,正在外面吃饭,运营的同事火急火燎地给我打电话,说是网站出问题了,用户登录不了,而且这种情况也不是全部,只有部分地区有问题.没办法,只能回到家里找问题,打开代码,翻来覆去地找问题,搞了整整一下 ...
- 用JSON数据向已定义列的表格添加数据行
其实添加方式和在MVC中动态读取JSON数据创建表格一样,只不过一个是完整表格添加,一个是从表格中间添加.不详细说明了. <div> <table class="table ...
- 纯css3实现的动画加载条
之前大大家分享了很多款加载条.今天给大家带来一款纯css3实现的动画加载条. 这款加载条适用浏览器:360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗. 不支持IE8 ...
- Linux 必掌握的 SQL 命令
数据库和 SQL 在本系列教程中,目前我们使用平面文本文件来存储数据.平面文本文件可能适合相对较少的数据,但它们对存储大量数据或查询该数据没有多大帮助.多年来,为该目的开发了多种数据库,包括分层和网络 ...
- 解决CSDN的code功能,无法git clone多个项目的问题
几天前在使用CSDN的git功能的时候发现一个问题:我在CSDN上创建了两个项目,但是却只能git clone其中的一个. 原因: 在添加ssh公钥的时候,将主机上的ssh公钥在CSDN上填的地方不合 ...
- <转>一道面试题比较synchronized和读写锁
一.科普定义(原文:http://903497571.iteye.com/blog/1874752) 这篇博文的两个主角“synchronized”和“读写锁” 1)synchronized 这个同步 ...