java中的native方法性能到底怎么样?
前言
java中的native方法性能到底怎么样?
第一次写博客,如果写的不好,望见谅,烦请指出问题,虚心学习
先说结论,native 方法性能不如java方法
一、native方法?
主要是java语言本身是无法调用操作系统提供的一些底层特性,比如打开文件,创建线程;本文不再介绍如何去使用JNI,只谈论性能
二、使用步骤
先创建一个具有native方法的类
代码如下(示例):
public class TestJNI {public int num1;static {System.load("/Users/alex/Library/Java/Extensions/TestJNI.jnilib");}/**int转string*/public native String intToString(int param);public native int stringToInt(String param);/**他的本质也是给num1属性set值*/public native void modifyNum1(int num1);public void setNum1(int num1) {this.num1 = num1;}
}
2.c语言实现
执行命令,编译成.h文件,(要注意,如果你的包名很长,那么你要回到你的包起始位置调用命令)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "com_Alex_io_jni_TestJNI.h"/** Class: com_Alex_io_jni_TestJNI* Method: intToString* Signature: (I)Ljava/lang/String;*/
JNIEXPORT jstring JNICALL Java_com_Alex_io_jni_TestJNI_intToString(JNIEnv *env, jobject o, jint j_int)
{int c_int = (int)j_int;if (c_int == 0){return (*env)->NewStringUTF(env,"0");} char* str = (char*)malloc(sizeof(char) * 20);int index = 0;while(c_int != 0){int tmp = c_int % 10;str[index++] = tmp + 48;c_int /= 10;}str[index] = '\0';for(int i = 0,j = index - 1,size = index / 2; i < size;i++,j--){str[i] ^= str[j];str[j] ^= str[i];str[i] ^= str[j];}return (*env)->NewStringUTF(env,str);
}/** Class: com_Alex_io_jni_TestJNI* Method: stringToInt* Signature: (Ljava/lang/String;)I*/
JNIEXPORT jint JNICALL Java_com_Alex_io_jni_TestJNI_stringToInt(JNIEnv *env, jobject o, jstring j_string)
{char* s = (char*)(*env)->GetStringUTFChars(env,j_string,0);int c_num = atoi(s);return (jint)c_num;
}/** Class: com_Alex_io_jni_TestJNI* Method: modifyNum1* Signature: (I)V*/
JNIEXPORT void JNICALL Java_com_Alex_io_jni_TestJNI_modifyNum1(JNIEnv *env, jobject o, jint j_int)
{jclass class = (*env)->GetObjectClass(env,o);jfieldID id = (*env)->GetFieldID(env,class,"num1","I");(*env)->SetIntField(env,o,id,j_int);
}
3.前两个方法主要是int转string,或int转string,有兴趣可关注下,主要谈第三个方法
第三个方法主要是为变量num1进行赋值,我们看下调用java方法和native方法赋值的性能如何
,看下测试代码
public class MyTest {public static void main(String[] args) {TestJNI testJNI = new TestJNI();
// String s = testJNI.intToString(434343220);
// int s = testJNI.stringToInt("1234567890");long start = System.currentTimeMillis();for (int i = 0; i < 100000; i++) {testJNI.modifyNum1(50);}System.out.println("调用native method(10w次) 耗时:" + (System.currentTimeMillis() - start));start = System.currentTimeMillis();for (int i = 0; i < 100000; i++) {testJNI.setNum1(50);}System.out.println("调用java method(10w次) 耗时:" + (System.currentTimeMillis() - start));System.out.println(testJNI.num1);}}
结果:
调用native method(10w次) 耗时:25
调用java method(10w次) 耗时:1
50进程已结束,退出代码 0
总结
可以看出性能差距比较大,native方法主要还是用于一些对于操控操作系统,对内存操作的算法上,通常可以用java实现的,还是不要用native方法,不正确的使用可能会导致内存泄漏与性能损失
java中的native方法性能到底怎么样?相关推荐
- java中的Native方法
由于Native方法最近经常碰到,好奇之下便找到了这篇博客,内容还是相当好理解的,下面即是正文部分: 一. 什么是Native Method 简单地讲,一个Native Method就是一个java调 ...
- 【Android 内存优化】Android 原生 API 图片压缩原理 ( 图片质量压缩方法 | 查找 Java 源码中的 native 方法对应的 C++ 源码 )
文章目录 一. 图片质量压缩方法 二. 查找对应的 Native 方法源码 三. 分析 Bitmap.cpp 中动态注册 Native 方法 在博客 [Android 内存优化]图片文件压缩 ( An ...
- 在Java中使用instanceof的性能影响
本文翻译自:The performance impact of using instanceof in Java I am working on an application and one desi ...
- Java中的main()方法详解
源文作者:leizhimin 源文链接:http://lavasoft.blog.51cto.com/62575/53263 源文作者版权申明: 版权声明:原创作品,允许转载,转载时请务必以超链 ...
- java中构造方法和方法全面解析
java中构造方法和方法全面解析 我相信大多说人都对构造方法.方法不陌生,而且很了解,但我也相信有很多像我这样的没有一个很好很清晰很全面的认识,今天就把它整理如下,希望能给大家带来点方便与帮助,也希望 ...
- 浅谈Java中的hashcode方法
哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...
- jAvA中deprecate,在Java中使用Deprecated方法或类是错误的吗?
1.在Java中使用Deprecated方法或类是错误的吗? 从已弃用的定义 : 注释@Deprecated的程序元素是程序员不鼓励使用的程序元素,通常是因为它是危险的,或者是因为存在更好的selec ...
- 品味性能之道十一:JAVA中switch和if性能比较
通常而言大家普遍的认知里switch case的效率高于if else.根据我的理解而言switch的查找类似于二叉树,if则是线性查找.按照此逻辑推理对于对比条件数目大于3时switch更优,并且对 ...
- java中的NIO和IO到底是什么区别?20个问题告诉你答案
摘要:NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多. 本文分享自华为云社区<jav ...
最新文章
- nyoj 925 国王的烦恼(最小生成树)
- python3的socket_python2 与 python3 socket编程的一点小区别
- 2019b官方手册中文版_数据科学|「最全」实至名归,NumPy 官方早有中文教程,结合深度学习,还有防脱发指南...
- Kubernetes从懵圈到熟练:认证与调度
- Python3.8 了解的差不多了吧,Python3.9 新特性了解一下!
- js将object转化为json数据,json数据转js对象
- 三大运营商的物联网卡如何收费
- c语言 枚举大小写,C语言枚举类型(Enum)深入理解
- 信息论笔记(需要编辑格式)
- 计算机联锁接口,计算机联锁接口设计规范.doc
- Ubuntu Server 20.04 设置静态 IP
- RedHat9上安装Oracle9i手记(原作:hotman_x)
- 迅雷该怎么把区块链这件事做好?
- DINO 论文精度,并解析其模型结构 DETR 的变体
- PDF改背景和字体颜色
- 桌面上的文件夹存储路径是什么?桌面文件夹误删了怎么找回
- Latex字体加粗不了
- iMovie教程:如何将照片添加至iMovie剪辑中?
- AutoPostBack属性值为True和False的含义 (即为和不和服务器交互)
- 在前互联网时代,宜家就有这些“互联网思维”