博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

android NDK 的性能研究

Posted on 2012-08-27 09:23  lake.cn  阅读(1115)  评论(0编辑  收藏  举报

本文转载自 http://blog.csdn.net/fangyuanseu/article/details/6875702 

 android NDK 学习

今天看到一篇来自韩国思密达的论文,没什么理论价值,但是对开发人员来讲很有指导价值,这篇文章说的是android应用开发NDK的方法和用java的方法的性能方面的差距(采用相同的算法),他们重点考察了这面几个方面的性能影响:

1整数运算

2浮点数运算

3访存性能

4 Allocate堆的算法

文章的开始先讲了几个概念,android NDK和jni,我在这边就略去不写了。

 

实验的环境:他们是在pc上面的android模拟器上面做的实验,pc: AMD Athlon II X2 245 2.9GHz, 4.0GB memory 模拟器:Android 2.1 (APIlevel 7) with the Android NDK R3 version

1 整数运算

实验方法:测量寻找素数的算法的时间,这个算法返回的值是输入n个整数中的素数。

实验结果:


上图中x轴是表示输入的整数的个数,y轴表示的是算法执行的时间(单位:ms)

从上面的这个图可以看出,使用NDK的方法比使用java的方法(在dalvik上面运行)效率要高不少,而且输入的数据越多两者这间的差距越大。

2 浮点运算:

实验方法:包含math.h这个头文件,然后用正弦和余弦函数来计算浮点数的算法,这个算法的返回值是从零度到输入角度的余弦和正弦值的和。

实验结果:


X轴表示输入的角度,y轴表示对是算法执行的时间(单位:ms)

实验结果表明浮点数的差距不是太大。

3 访存算法

实验方法:在堆内存中,用冒泡排序的最坏情况,时间复杂度是O(n2)。

实验结果:


x轴表示输入的整数数组的长度,y轴表示的是算法执行的时间(单位:ms)。

这个实验表明,两者在堆内存访问上面的差距巨大。

4 堆内存申请算法

试验方法:计算申请一块4K倍数的堆内存的时间。

实验结果:


X轴表示4k大小的倍数,y轴表示的是申请的消耗的时间(单位:ms)。

实验结果表明,NDK的方法明显要快很多。

一般来说,堆内存在java语言中用在创建对象的时候,在C/C++中用在动态内存申请。

动态申请内存是为了避免内存浪费,相比于静态申请而言,动态申请内存要慢,而且有内存泄露的和内存耗尽的危险。

虽然动态申请内存要快的多但是作为C/C++开发人员要慎重使用。

总结:

通过四个方面对使用android NDK和使用java性能方面的影响做一个定量的分析,这对于开发人员来讲有很大的借鉴意义,在开发的时候我们可以根据上面的数据来确定什么时候使用NDK什么时候使用java,但是在考虑如何取舍时候一定要考虑NDK的方法使得代码的复杂度提高这一事实。

对我个人的意义在于,可以使用ndk的方法来提高android上面3d图形渲染的性能,因为一个稍微复杂点的3d曲面就有相当多的vertex和index。