JNI与JNA性能比较
JNI与JNA性能比较
在介绍JNA时,提到了JNA是基于JNI的,是在JNI上封装了一层,JNI性能不如JNA。最近在网上看到篇简单的比较这两者性能的文档,感觉不错,现转载一下:
分别用JNI和JNA的方式建立dll,dll中包含一个get方法和一个set方法,在Java端进行循环调用1000*1000次,比较所耗费的时间。
JNI和JNA调用的不是同一个dll,但是功能和代码基本相同。本测试从一定角度反映他们的性能。
【JNI实现】
先编写Java相关的native方法:
- package crayon.jni;
- public class JNITest {
- public native static void set(int i);
- public native static int get();
- static{
- System.loadLibrary("JNITest");
- }
- }
然后利用javah命令从上述带native方法的class文件导出.h头文件,并编写C代码实现为:
- #include "stdafx.h"
- #include "JNITest.h"
- long tmp = 0;
- JNIEXPORT void JNICALL Java_crayon_jni_JNITest_set
- (JNIEnv *, jclass, jint value){
- tmp = value;
- }
- JNIEXPORT jint JNICALL Java_crayon_jni_JNITest_get
- (JNIEnv *, jclass){
- return tmp;
- }
生成dll动态链接库,并测试,最后时间为:
- package crayon.jni;
- public class TestJNI {
- public static void main(String[] args) {
- long beginTime = System.currentTimeMillis();
- int i;int j;
- for(i=0;i<1000;i++){
- for(j=0;j<1000;j++){
- JNITest.set(i*j);
- JNITest.get();
- }
- }
- long totalTime = System.currentTimeMillis()-beginTime;
- System.out.println("JNI消耗的总时间(ms):"+totalTime);
- }
- }
- JNI消耗的总时间(ms):16
【JNA实现】
对于JNA,我们可以直接先写C代码了,如下分别为.h文件和.cpp文件:
- #ifdef JNATEST_EXPORTS
- #define JNATEST_API __declspec(dllexport)
- #else
- #define JNATEST_API __declspec(dllimport)
- #endif
- extern "C" {
- JNATEST_API void set(long l);
- JNATEST_API long get();
- }
- #include "stdafx.h"
- #include "JNATest.h"
- long tmp;
- JNATEST_API void set(long l){
- tmp = l;
- }
- JNATEST_API long get(){
- return tmp;
- }
直接写Java端代码调用上述导出的dll文件,注意别忘记引入JNA相关的jar包,代码为:
- package crayon.jna;
- import com.sun.jna.Library;
- import com.sun.jna.Native;
- public interface JNATest extends Library {
- JNATest INSTANCE = (JNATest) Native.loadLibrary(
- "D:/CC/Tools_Tool_ITT_StdPrj_Dev/PF_Tools_VOB/Tools_SubTool/src/JNATest/Release/JNATest", JNATest.class);
- public void set(int i);
- public int get();
- }
测试代码和结果为:
- package crayon.jna;
- import com.sun.jna.Library;
- import com.sun.jna.Native;
- public interface JNATest extends Library {
- JNATest INSTANCE = (JNATest) Native.loadLibrary(
- "D:/CC/Tools_Tool_ITT_StdPrj_Dev/PF_Tools_VOB/Tools_SubTool/src/JNATest/Release/JNATest", JNATest.class);
- public void set(int i);
- public int get();
- }
- JNA消耗的总时间(ms):2593
综上比较:JNI 16ms << JNA 2593ms!!!性能差距还蛮大的!!
本着赤果果地实事求是地态度,我在自己的lenovo
昭阳K46(XP,处理器i3,内存升级4G--实际使用3G)的机器上测试了一下,结果为(取10次平均):JNI 120.5ms JNA
4535.8ms !!我的本本貌似不是很给力,但测试结果整体趋势差不多!
这次试验,本身也有一个收获,就是:在JNI(或JNA)应用中,在Java端,我们会有一个对象,其中调用的方法都会映射到本地代码中,只要我们是同一个Java对象,我们同样可以将一个值在一次本地方法调用中设置到对象里,然后在下一次调用中使用。当然这个值是保存在本地代码中的。
JNI与JNA性能比较的更多相关文章
- jni之jni与jna的比较
java开发过程中会遇到需要调用c/c++动态库(windows平台的dll和linux平台的so)的情况,可以使用JNI或者JNA技术. JNA基于JNI技术开发,主要在上层作了类型自动转换的封装, ...
- Android 性能优化(18)JNI优化:JNI Tips 提升性能技巧
JNI Tips 1.In this document JavaVM and JNIEnv Threads jclass, jmethodID, and jfieldID Local and Glob ...
- JNI的替代者—使用JNA访问Java外部功能接口
摘自:http://www.cnblogs.com/lanxuezaipiao/p/3635556.html JNI的替代者-使用JNA访问Java外部功能接口 1. JNA简单介绍 先说JNI(Ja ...
- JNA—JNI终结者
JNA—JNI终结者 介绍 给大家介绍一个最新的访问本机代码的Java框架—JNA. JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的J ...
- 【C/C++开发】【Java开发】JNI的替代者—使用JNA访问Java外部功能接口
JNI的替代者-使用JNA访问Java外部功能接口 1. JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言( ...
- NDK(20)JNI的5大性能缺陷及优化技巧
转自 : http://www.ibm.com/developerworks/cn/java/j-jni/index.html JNI 编程缺陷可以分为两类: 性能:代码能执行所设计的功能,但运行缓慢 ...
- JNI/NDK开发指南(九)——JNI调用性能測试及优化
转载请注明出处:http://blog.csdn.net/xyang81/article/details/44279725 在前面几章我们学习到了.在Java中声明一个native方法,然后生成本地接 ...
- JNI的又一替代者—使用JNR访问Java外部函数接口(jnr-ffi)
1. JNR简单介绍 继上文“JNI的替代者—使用JNA访问Java外部函数接口”,我们知道JNI越来越不受欢迎,JNI是编写Java本地方法以及将Java虚拟机嵌入本地应用程序的标准编程接口.它管理 ...
- Java跨语言调用,使用JNA访问Java外部接口
1. JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C++)写的代码进行交互,只要遵守调用约定即 ...
随机推荐
- ps查看内存占用排序
ps -eo rss,pmem,pcpu,vsize,args | sort -k 1 -r -n | less 解析一下: ps 都知道,是linux,unix显示进程信息的, -e 是显示所有进程 ...
- python之路-随笔 python处理excel文件
小罗问我怎么从excel中读取数据,然后我百了一番,做下记录 以下代码来源于:http://www.cnblogs.com/lhj588/archive/2012/01/06/2314181.html ...
- BZOJ 2733 HNOI 2012 永无乡 平衡树启示式合并
题目大意:有一些岛屿,一開始由一些无向边连接. 后来也有不断的无向边增加,每个岛屿有个一独一无二的重要度,问随意时刻的与一个岛屿联通的全部岛中重要度第k大的岛的编号是什么. 思路:首先连通性一定要用并 ...
- 单调队列-Hdu-4122-Alice's mooncake shop
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4122 题目意思: 一家月饼店,有n个订单,从2001年1月1日0时开始24小时营业开m个小时,且每个 ...
- Linux shell编程 4 ---- shell中的循环
1 for循环 1 for语句的结构 for variable in values; do statement done 2 for循环通常是用来处理一组值,这组值可以是任意的字符串的集合 3 for ...
- [置顶] 【cocos2d-x入门实战】微信飞机大战之十二:分数的本地存储
转载请表明地址:http://blog.csdn.net/jackystudio/article/details/12036237 作为一个单机游戏,连分数存储的的功能都没有,让它怎么在单机游戏圈里混 ...
- Dalvik虚拟机的启动过程分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8885792 在Android系统中,应用程序进 ...
- JAVA反射机制示例,读取excel数据映射到JAVA对象中
import java.beans.PropertyDescriptor; import java.io.File; import java.io.FileInputStream; import ja ...
- 22. 使用 awk / grep / head / tail 命令进行文本 / 日志分析 (/home/D/acc.log)
一.awk # 统计 a-read-file 接口 中,接口耗时 超过 0.007 秒的有多少个请求 D@Demon ~]$ awk '$7>0.007' acc.log | w ...
- .net中用到的一些方法
//文件操作string fullDirPath = Utils.GetMapPath(string.Format("/aspx/{0}/", buildPath)); Direc ...