前言

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方法性能到底怎么样?相关推荐

  1. java中的Native方法

    由于Native方法最近经常碰到,好奇之下便找到了这篇博客,内容还是相当好理解的,下面即是正文部分: 一. 什么是Native Method 简单地讲,一个Native Method就是一个java调 ...

  2. 【Android 内存优化】Android 原生 API 图片压缩原理 ( 图片质量压缩方法 | 查找 Java 源码中的 native 方法对应的 C++ 源码 )

    文章目录 一. 图片质量压缩方法 二. 查找对应的 Native 方法源码 三. 分析 Bitmap.cpp 中动态注册 Native 方法 在博客 [Android 内存优化]图片文件压缩 ( An ...

  3. 在Java中使用instanceof的性能影响

    本文翻译自:The performance impact of using instanceof in Java I am working on an application and one desi ...

  4. Java中的main()方法详解

    源文作者:leizhimin    源文链接:http://lavasoft.blog.51cto.com/62575/53263 源文作者版权申明: 版权声明:原创作品,允许转载,转载时请务必以超链 ...

  5. java中构造方法和方法全面解析

    java中构造方法和方法全面解析 我相信大多说人都对构造方法.方法不陌生,而且很了解,但我也相信有很多像我这样的没有一个很好很清晰很全面的认识,今天就把它整理如下,希望能给大家带来点方便与帮助,也希望 ...

  6. 浅谈Java中的hashcode方法

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...

  7. jAvA中deprecate,在Java中使用Deprecated方法或类是错误的吗?

    1.在Java中使用Deprecated方法或类是错误的吗? 从已弃用的定义 : 注释@Deprecated的程序元素是程序员不鼓励使用的程序元素,通常是因为它是危险的,或者是因为存在更好的selec ...

  8. 品味性能之道十一:JAVA中switch和if性能比较

    通常而言大家普遍的认知里switch case的效率高于if else.根据我的理解而言switch的查找类似于二叉树,if则是线性查找.按照此逻辑推理对于对比条件数目大于3时switch更优,并且对 ...

  9. java中的NIO和IO到底是什么区别?20个问题告诉你答案

    摘要:NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多. 本文分享自华为云社区<jav ...

最新文章

  1. nyoj 925 国王的烦恼(最小生成树)
  2. python3的socket_python2 与 python3 socket编程的一点小区别
  3. 2019b官方手册中文版_数据科学|「最全」实至名归,NumPy 官方早有中文教程,结合深度学习,还有防脱发指南...
  4. Kubernetes从懵圈到熟练:认证与调度
  5. Python3.8 了解的差不多了吧,Python3.9 新特性了解一下!
  6. js将object转化为json数据,json数据转js对象
  7. 三大运营商的物联网卡如何收费
  8. c语言 枚举大小写,C语言枚举类型(Enum)深入理解
  9. 信息论笔记(需要编辑格式)
  10. 计算机联锁接口,计算机联锁接口设计规范.doc
  11. Ubuntu Server 20.04 设置静态 IP
  12. RedHat9上安装Oracle9i手记(原作:hotman_x)
  13. 迅雷该怎么把区块链这件事做好?
  14. DINO 论文精度,并解析其模型结构 DETR 的变体
  15. PDF改背景和字体颜色
  16. 桌面上的文件夹存储路径是什么?桌面文件夹误删了怎么找回
  17. Latex字体加粗不了
  18. iMovie教程:如何将照片添加至iMovie剪辑中?
  19. AutoPostBack属性值为True和False的含义 (即为和不和服务器交互)
  20. 在前互联网时代,宜家就有这些“互联网思维”

热门文章

  1. 前端json对象与json字符串相互转换的方式
  2. 《go语言实战》阅读笔记01
  3. nginx负载均衡面试题
  4. 终端天线—2.IFA天线仿真
  5. 黑苹果活动监视器闪退的解决办法
  6. ubuntu20.04 日常办公
  7. Linux下ffmpeg的安装
  8. 恋爱小女孩给男朋友写的信
  9. Coursera | Introduction to Data Analytics(IBM) | Quiz答案
  10. JavaMail附件中文名称乱码