浅谈.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中其实就是算法竞赛,所以时间复杂度非常重要,一个是否优秀的算法或许就决定了人生,而在大多数情况下,我们想出的算法或许并不那么尽如人意,所以这时候就需要一中神奇的的东西,就是底层优化: 其 ...
随机推荐
- JS Flex交互:html嵌套Flex(swf)
一.html页面嵌套Flex需要用到 swfobject.js swfobject的使用是非常简单的,只需要包含 swfobject.js这个js文件,然后在DOM中插入一些简单的JS代码,就能嵌入F ...
- cocos2d制作动态光晕效果基础——blendFunc
转自:http://www.2cto.com/kf/201207/144191.html 最近的项目要求动态光晕的效果. 何谓动态光晕?之前不知道别人怎么称呼这个效果, 不过在我看来,“动态光晕”这个 ...
- NFS错误Starting NFS quotas: Cannot register service: RPC: Unable to receive; errno=Connection refused
NFS报错一例 [root@bjs0- ~]# /etc/init.d/portreserve start Starting portreserve: ...
- Codeforces Round #309 (Div. 1) B. Kyoya and Permutation 构造
B. Kyoya and Permutation Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/ ...
- c#winform使用WebBrowser 大全[超长文转载]
1.主要用途:使用户可以在窗体中导航网页. 2.注意:WebBrowser 控件会占用大量资源.使用完该控件后一定要调用 Dispose 方法,以便确保及时释放所有资源.必须在附加事件的同一线程上调用 ...
- OpenGL 4.0 GLSL 实现 投影纹理映射(Projective Texture Mapping) (转)
http://blog.csdn.net/zhuyingqingfen/article/details/19331721 分类: GLSL 投影纹理映射 (projective texture ...
- EasyUI基础入门之Pagination(分页)
前言 对于一些企业级的应用来说(非站点),页面上最为基本的内容也就是表格和form了.对于类似于ERP这类系统来说数据记录比較大,前端表格展示的时候必需得实现分页功能了.恰巧EasyUI就提供了分页组 ...
- iOS开发——实用OC篇&多种定时器详细介绍
多种定时器详细介绍 在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法.在这个时候,我们就需要用到定时器. 然而,在iOS中有很多方法完成以上的任务,到底有 ...
- MySQL · 特性分析 · 内部临时表
http://mysql.taobao.org/monthly/2016/06/07/#rd MySQL中的两种临时表 外部临时表 通过CREATE TEMPORARY TABLE 创建的临时表,这种 ...
- mysql博客
http://blog.csdn.net/mchdba/article/details/9190771 本帖最后由 mchdba 于 2014-2-10 17:15 编辑 公司招聘MySQL DBA, ...