NDK开发与实践(入门篇·微课视频版)
9.3 DirectBuffer的使用场景
当使用byte[]数组时,Java代码需要将数据从Java堆复制到原生内存(例如,通过JNI的SetByteArrayRegion()或GetByteArrayRegion()函数),然后原生代码才能访问这些数据。这种数据复制操作可能会带来额外的性能开销。在某些实现中,可以使用GetByteArrayElements()和 GetPrimitiveArrayCritical()函数获取指向托管堆中原始数据的实际指针,但在其他实现中,它会在原生堆上分配缓冲区并复制数据,所以,byte[]传递是否能获得真正的原始数据的指针,取决于虚拟机的实现,而直接字节缓冲区允许原生代码直接访问其内存区域,无须进行这种复制操作。
9.3.1 大数据量的IO密集型操作
对于需要处理大量数据的IO密集操作,如文件读写、网络通信等,DirectBuffer可以
显著提高性能。由于DirectBuffer的内存分配在JVM堆外,因此可以避免在Java堆内存和操作系统之间复制数据的需要,从而减少了数据处理的时间和CPU的负载。
9.3.2 长期使用的数据
对于那些需要长期使用的数据,使用DirectBuffer可以避免频繁地创建和销毁堆内
Buffer所带来的额外开销。由于DirectBuffer的生命周期内的内存地址都不会再发生更改,因此内核可以安全地对其进行访问。
9.3.3 对内存管理有特殊要求的场景
DirectBuffer的使用降低了垃圾收集的压力,因为它们不受JVM垃圾收集的直接管
理。这在一些对内存管理有特殊要求的场景中可能非常有用,例如需要避免频繁垃圾收集导致的性能波动或延迟。
9.3.4 需要直接访问操作系统内存资源的场景
DirectBuffer提供了一种高效的方式来直接访问和操作系统级别的内存资源。这种方式允许Java应用程序能够更接近操作系统的底层,提供了更为高效的数据处理能力。
9.4 DirectBuffer的使用案例
示例代码将演示在原生代码中申请缓冲区,并通过JNI接口使其可被Java代码访问。在Java端,利用获得到的缓冲区的引用将数据高效地传递到原生代码中。同时,示例代码将记录两种传递方式分别运行10000000次的耗时。
代码如下:
//第9章/MainActivity.java
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
static {
System.loadLibrary("directbuffer");
}
ByteBuffer mByteBuffer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//获得native中申请的缓冲区
mByteBuffer = getNativeByteBuffer();
//申请一个byte数组
byte[] bytes = new byte[10240];
//初始化数组内容
for (int i = 0; i < 10240; i++) {
bytes[i] = (byte) i;
}
//将byte数组放到bytebuffer中
mByteBuffer.put(bytes);
int count = 10000000;
//打印时间
Log.e(TAG, "onCreate: sendData start time: " + SystemClock.currentThreadTimeMillis());
while (count > 0){
//通知原生代码操作数据
sendData();
count --;
}
Log.e(TAG, "onCreate: sendData end time: " + SystemClock.currentThreadTimeMillis());
count = 1000000;
//打印时间
Log.e(TAG, "onCreate: setByteData start time: " + SystemClock.currentThreadTimeMillis());
while (count > 0){
//将byte[]传递到原生代码中
setByteData(bytes);
count --;
}
Log.e(TAG, "onCreate: setByteData end time: " + SystemClock.currentThreadTimeMillis());
}
/**
* 获取native申请的DirectBuffer
* @return DirectBuffer
*/
public native ByteBuffer getNativeByteBuffer();
/**
* 通知原生代码操作数据
*/
public native void sendData();
/**
* 使用byte[]数组传递方式
* @param data byte[]
*/
public native void setByteData(byte[] data);
}
原生代码实现代码如下:
//第9章/native-lib.c
include <jni.h>
include <string.h>
include <malloc.h>
include <android/log.h> //添加头文件
define LOG_TAG "jni" //定义TAG
define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, VA_ARGS)
unsigned char *gl_buffer = NULL; //DirectBuffer地址
unsigned int gl_capacity; //DirectBuffer 容量
unsigned char buffer[10240] = {0}; //用来模拟数据的复制
JNIEXPORT jobject JNICALL
Java_com_example_directbuffer_MainActivity_getNativeByteBuffer(JNIEnv *env, jobject thiz) {
if (NULL == gl_buffer){
gl_buffer = malloc(10240);
}
return (*env)->NewDirectByteBuffer(env, gl_buffer, 10240);
}
JNIEXPORT void JNICALL
Java_com_example_directbuffer_MainActivity_sendData(JNIEnv *env, jobject thiz) {
//由于是DirectBuffer,这里可以直接使用gl_buffer,无须复制
}
JNIEXPORT void JNICALL
Java_com_example_directbuffer_MainActivity_setByteData(JNIEnv env, jobject thiz, jbyteArray data) {
//模拟数据的使用,将数组内容复制到gl_buffer中才能使用
(env)->GetByteArrayRegion(env, data, 0, 10240, gl_buffer);
}
运行结果如下:
//使用DirectBuffer,10000000次执行耗时66ms
sendData start time: 117
sendData end time: 183
//直接传递byte[],10000000次执行耗时2021ms
setByteData start time: 183
setByteData end time: 2204
对于不同次数比较的运行结果,见表9-1。
表 9 1 运行结果比较
运行次数 DirectBuffer byte[] 差值(ms)
1000 0 0 0
10000 3 4 1
100000 12 24 12
1000000 18 208 190
10000000 66 2021 1955
从运行结果可以看出,随着运行次数的增加,相较于使用byte[],使用DirectBuffer对性能的提升也就越明显。
NDK开发与实践(入门篇·微课视频版)的更多相关文章
- 《Unity3D大风暴之入门篇(海量教学视频版)》
<Unity3D大风暴之入门篇(海量教学视频版)> 基本信息 作者: 智画互动开发团队 出版社:电子工业出版社 ISBN:9787121222429 上架时间:2014-1-13 出版日期 ...
- 云小课|DGC数据开发之基础入门篇
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:欢迎来到DGC数据 ...
- Python:Excel自动化实践入门篇 甲【留言点赞领图书门票】
*以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「englyf」https://mp.weixin.qq.com/s?__biz=MzUxMTgxMzExNQ==&mid=22 ...
- Python:Excel自动化实践入门篇 乙【送图书活动继续】
*以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「englyf」https://mp.weixin.qq.com/s/y-npGelPJwmx3iNvHaXRTg 本文上接<Py ...
- 学习版pytest内核测试平台开发万字长文入门篇
前言 2021年,测试平台如雨后春笋般冒了出来,我就是其中一员,写了一款pytest内核测试平台,在公司落地.分享出来后,有同学觉得挺不错,希望能开源,本着"公司代码不要传到网上去,以免引起 ...
- JNI/NDK开发指南(开山篇)
转载请注明出处:http://blog.csdn.net/xyang81/article/details/41759643 相信很多做过Java或Android开发的朋友经常会接触到JNI方面的技术, ...
- 用Camtasia设计微课视频封面,让课程更加高大上
在网络时代,尤其现在疫情影响只能线上学习,微课的应用前景已经越来越广了.但是想把微课做好,只有内容与录制精细是不够的,还需要一个精美的封面来吸引学生.接下来,小编就用微课制作软件Camtasia 20 ...
- Django开发博客 入门篇
Django是神马? Django是一个开源免费的Web框架,使用Python编写.能够让你快速写出一个Web应用, 因为它包含了绝大部分的组件,比如认证,表单,ORM,Session,安全,文件上传 ...
- 使用Asp.Net Core MVC 开发项目实践[第一篇:项目结构说明]
先从下图看整体项目结构: Mango.Manager: 为后台管理项目 Mango.Web: 为前台项目 Mango.Framework.Core: 为常用的基础操作类项目 Mango.Framewo ...
- vivo浏览器的快速开发平台实践-总览篇
一.什么是快速开发平台 快速开发平台,顾名思义就是可以使得开发更为快速的开发平台,是提高团队开发效率的生产力工具.近一两年,国内很多公司越来越注重研发效能的度量和提升,基于软件开发的特点,覆盖管理和优 ...
随机推荐
- Hugging Face 开源 HopeJR 机器臂!今日直播带你深入技术核心
我们的 LeRobot 项目又有了新动作 - HopeJR 正式开源! HopeJR 是一款拥有 23 自由度的开源仿生机械臂系统,支持遥操作控制,具备完成复杂任务的能力,适用于科研与开发场景.整个机 ...
- Linguistics-English-Happy Labor Day September 2, 2024
Celebrating the many contributions workers have made to America's strength, prosperity and well-bein ...
- JVM问题典型案例定位学习
下面这4个案例来自大神"你假笨"(任职阿里期间,花名:寒泉子)在qcon上的分享,记录一下: 一.类加载死锁 现象:jstack将线程dump出来后,找不到deadlock字样的死 ...
- Centos8搭建hadoop高可用集群
以下是基于 CentOS 8 搭建高可用 Hadoop 集群的完整操作流程及命令,涵盖 6 台主机的规划.部署步骤和高可用(HA)配置.结合 Hadoop 3.x 官方文档和最佳实践整理: 先决条件 ...
- Django模型开发:模型字段、元数据与继承全方位讲解
一.模型字段类型详解 在 Django 开发中,模型(Model)是连接应用程序与数据库的核心桥梁. Django 与 MySQL 字段类型映射 Django 模型的每个字段都是特定 Field 类的 ...
- [题解]P4116 Qtree3
P3925 aaa被续 题目描述没看懂(雾) 简单解释一下: 对于节点\(u\),将子树\(u\)中的权值从大到小排序,记"权值乘排名之和"为\(u\)的贡献. 输出总贡献. 下文 ...
- [题解]UVA11235 Frequent values
UVA11235 Frequent values 没看到多测调了半天 每组数据给定\(n,q\).接下来给出一个长度为\(n\)的不降序列\(A\).接下来\(q\)次询问,每次询问给定\(l,r\) ...
- Cyberduck 小黄鸭 跨平台的 FTP 软件
简介 1.Cyberduck是一款带图形界面的FTP客户端软件,目前有windows版和mac版. 2.支持文件下载,上传,删除等操作 3.官网地址:https://cyberduck.io/ 用途 ...
- 使用Babel将ES6代码转为ES5代码,从而在现有环境执行。
https://blog.csdn.net/weixin_44797182/article/details/127622359 前言在线转码 https://babeljs.io/repl/#http ...
- npm install 报错:verbose stack Error: unable to resolve dependency tree
错误描述 > npm install npm WARN old lockfile npm WARN old lockfile The package-lock.json file was cre ...