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。



阅读更多
个人分类: android
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭