为了账号安全,请及时绑定邮箱和手机立即绑定

[转]Android:高效的Android代码编写

标签:
Java Android

本文转自:</p> <p>今世的手持设备,与其说是电话,更像一台拿在手中的Computer。然而,就算是“最快”的手持设备,其品质也赶不上一台一般的台式计算机。</p> <p>  那正是为啥我们在书写Android应用程序的时候要这个关切成效。这么些设备并不曾那么快,何况受电瓶电量的钳制。那表示,设备尚未越来越多的力量,大家无法不把程序写的玩命有效。</p> <p>简介</p> <p>对于占用财富的种类,有两条为主条件:</p> <p>* 不要做不须要的事<br> * 不要分配不须要的内部存款和储蓄器</p> <p>具有上边的内容都遵守那三个规范化。</p> <p>  某个人可能立刻会跳出来,把本节的大比比较多内容归于“草率的优化”(xing:参见[The Root of All Evil]), 不行以还是不行以认微优化(micro-optimization。xing:代码优化,相对于结构优化)确实会带来众多难点,诸如不能运用更有用的数据结构和算 法。可是在手持设备上,你讨厌。要是你以为Android虚构机的天性与台式机万分,你的先后很有异常的大或许率一早先就占用了系统的全体内存(xing:内存十分小),那会让您的程序慢得像蜗牛一样,更遑论做别的的操作了。

  当大家开宗明义、直击宗目的在于此之前,还非得要唤醒大家一点:不论VM是还是不是匡助实时(JIT)编写翻译器(xing:它同意实时地将Java解说型 程序主动编写翻译开销机机器言语,以使程序试行的进程更加快。有个别JVM饱含JIT编译器。),上边提到的那一个标准都是创设的。固然大家有对象彻底同样的多个方 法,在分解施行时foo()比bar()快,那么编写翻译之后,foo()照旧会比bar()快。所以不用寄希望于编写翻译器能够挽留你的次第。


就算你在用户界面循环中分匹配成目标内部存款和储蓄器,就能掀起周期性的垃圾堆回收,用户就能够以为分界面像打嗝相同一顿一顿的。

* 当您从用户输入的数量中截取一段字符串时,尽量选拔substring函数获得原始数据的贰个子串,并不是为子串其余树立一份复制。那样你就有一个新的String目标,它与原来数据分享一个char数组。
* 若是您有贰个函数重返三个String目标,而你方便的通晓那些字符串会被增大到一个StringBuffer,那么,请退换那几个函数的参数和促成情势,直接把成果附加到StringBuffer中,而实际不是再次创下立三个指日可待的暂时目标。

* int数组比Integer数组好,那也囊括了三个骨干现实,三个平行的int数组比(int,int)目标数组品质要好广大。同理,那试用于全体中央类型的构成。
* 假若您想用一种容器存款和储蓄(Foo,Bar)元组,尝试利用四个单身的Foo[]数组和Bar[]数组,一定比(Foo,Bar)数组功用更加高。(也或许有两样的状况,就是当您树立二个API,让外人调用它的时分。那时分你要侧重对API借口的规划而殉职一点儿进程。当然在API的个中,你仍 要尽或者的巩固代码的功能)

动用本地点法

当你在管理字串的时分,不要爱抚运用String.indexOf(), String.lastIndexOf()等特种完成的艺术(specialty methods)。那些办法都是应用C/C++完结的,比起Java循环快10到100倍。


Map myMap1 = new HashMap();
HashMap myMap2 = new HashMap();

规行矩步死板的视角Map会更加好些,由于那样您能够变动她的现实贯彻类,只需那几个类承袭自Map接口。古板的理念对于古板的次第是不易的,不过它并不适合嵌入式系统。调用贰个接口的援用会比调用实体类的援用多开销一倍的日子。

用静态办法比虚办法好

设若你无需寻访一个指标的分子变量,那么请把艺术声明成static。虚办法施行的更加快,由于它能够被直接调用而没有须要一个虚函数表。其余你也能够经过阐明彰显出这一个函数的调用不会转移目的的事态。


  在Android上,这就不是个好主意了。虚办法的支出比一向访谈成员变量大得多。在通用的接口界说中,能够依据OO的措施界说getters和setters,可是在一般的类中,你应有直接拜访变量。


for (int i = 0; i < this.mCount; i++)
dumpItem(this.mItems[i]);

int count = this.mCount;
Item[] items = this.mItems;

(运用”this”是为了注脚这个是成员变量)

for (int i = 0; i < this.getCount(); i++)
dumpItems(this.getItem(i));

protected void drawHorizontalScrollBar(Canvas canvas, int width, int height) {
if (isHorizontalScrollBarEnabled()) {
int size = mScrollBar.getSize(false);
if (size <= 0) {
size = mScrollBarSize;
}
mScrollBar.setBounds(0, height - size, width, height);
mScrollBar.setParams(
computeHorizontalScrollRange(),
computeHorizontalScrollOffset(),
computeHorizontalScrollExtent(), false);
mScrollBar.draw(canvas);
}
}

另外正是办法的参数与本土变量的功能同样。


static int intVal = 42;
static String strVal = “Hello, world!”;

static final int intVal = 42;
static final String strVal = “Hello, world!”;

将贰个办法或类表明为”final”不会推动品质的晋级换代,但是会协理编写翻译器优化代码。举个例子说,借使编写翻译器知道三个”getter”办法不会被重载,那么编写翻译器会对其使用内联调用。

小心运用foreach

foreach能够用在促成了Iterable接口的聚合类型上。 foreach会给这么些目标分配二个iterator,然后调用 hasNext()和next()办法。你最佳运用foreach管理ArrayList目标,不过对其他会集目标,foreach相当于采取iterator。

public class Foo {
int mSplat;
static Foo mArray[] = new Foo[27];

public static void one() {
int sum = 0;
Foo[] localArray = mArray;
int len = localArray.length;
for (int i = 0; i < len; i++) {
sum += localArray[i].mSplat;
}
}

在zero()中,每趟循环都会拜访两遍静态成员变量,获得叁遍数组的尺寸。 retrieves the static 田野同志 twice and gets the array length once for every iteration through the loop.

two()运用了在java1.5中引进的foreach语法。编写翻译器会将对数组的援引和数组的长度保存到当地变量中,那对拜访数组成分非常好。不过编写翻译器还有或许会在历次循环中发出三个附加的对地点变量的蕴藏操作(对变量a的存取)那样会比one()多出4个字节,速度要稍稍慢一些。

幸免采纳枚举

枚举变量特别便利,但不幸的是它会捐躯施行的速度和并大幅度增Gavin件体量。比方:

会产生多个900字节的.class文件 (Foo$Shubbery.class)。在它被第叁回调用时,这一个类会调用起先化办法来计划每种枚举变 量。各个枚举项都会被声称成七个静态变量,并被赋值。然后将这么些静态变量放在贰个名称为”$VALUES”的静态数组变量中。而这么一大堆代码,仅仅是为着 运用多个整数。

Shrubbery shrub = Shrubbery.GROUND;会引起二个对静态变量的援用,假使这一个静态变量是final int,那么编写翻译器会向来内联那个常数。

稍微景况下,运用ordinal()办法获得枚举变量的整数值会更好有的,比世尊讲,将:

替换为:

for (int n = 0; n < count; n++)
{
int valItem = items[n].e.ordinal();

会使品质获得一些更进一步,但那并非终极的化解之道。

请看下边包车型客车类界说:

public void run() {
Inner in = new Inner();
mValue = 27;
in.stuff();
}

private class Inner {
void stuff() {
Foo.this.doStuff(Foo.this.mValue);
}
}
}

难题是在技巧上来说(在骨子里)Foo$Inner是多少个全然独立的类,它要直接访谈Foo的私有成员是不法的。要超过这么些界限,编写翻译器须求生成一组办法:

里头类在每趟访谈”mValue”和”doStuff”办法时,都会调用那个静态办法。正是说,上面的代码表明晰贰个主题资料,你是在经过接口办法拜访那么些分子变量和函数而不是直接调用它们。在头里咱们曾经说过,运用接口办法(getter、setter)比一贯访谈速度要慢。所以那一个事例正是在一定语 法下边发生的一个“隐性的”功能妨碍。

防止运用浮点数

在跑马CPU呈现从前,游戏规划者做得最多的就是整数运算。跟着奔腾的到来,浮点运算管理器成为了CPU内置的性状,浮点和整数同盟运用,可以令你的玩乐运转得更顺利。日常在桌面Computer上,你可以大肆的接纳浮点运算。</p> <p>不过丰盛惋惜,嵌入式管理器平常未有援助浮点运算的硬件,全部对”float”和”double”的运算都以经过软件完结的。一些大旨的浮点运算,以至须要阿秒级的日子手艺到位。



点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消