深入学习JNI之前,介绍一个比较好的学习文档:jni详细教程。我这里只是一个Demo测试性能,至于入门教程请看我前一篇博文

Demo展示

这个Demo用于从小到大的冒泡排序,App.java代码:

package net.oseye.JniDemo;

public class App
{
public static void main( String[] args )
{
int[] nums={2,6,9,18,5,7}; Sort sort=new Sort();
//调用native方法
int[] res=sort.bubble(nums,nums.length); for(int i:res){
System.out.print(i+"\t");
}
}
} class Sort{
static{
System.loadLibrary("sort");
} /*
* 声明native方法
*/
public native int[] bubble(int[] nums,int len);
}

c++代码:

#include <stdio.h>
#include "net_oseye_JniDemo_Sort.h" JNIEXPORT jintArray JNICALL Java_net_oseye_JniDemo_Sort_bubble
(JNIEnv *env, jobject obj, jintArray arr, jint n)
{
jintArray iarr = (*env)->NewIntArray(env, n); jint num[n];
(*env)->GetIntArrayRegion(env, arr, 0, n, num);
int i, j;
for(i = 0; i < n; i++)
{
for(j = 0; i + j < n - 1; j++)
{
if(num[j] > num[j + 1])
{
int temp = num[j];
num[j] = num[j + 1];
num[j + 1] = temp;
}
}
} (*env)->SetIntArrayRegion(env, iarr, 0, n, num);
(*env)->ReleaseIntArrayElements(env, arr, num, 0);
return iarr;
}

执行输出:

2 5 6 7 9 18

Java和c/c++数据类型转换是一个学习重点,还有关于内存分配与释放以及异常抛出等,参考官方文档

性能测试

成功执行上面的Demo,你一定信心满满,以后可以把Java和C/C++结合来用,Java的便捷+C/C++高性能,但下面的测试会让你非常有挫折感。

我添加一个Java方法:jbubble也用于从小到大的冒泡排序,App.java代码:

package net.oseye.JniDemo;

public class App
{
public static void main( String[] args )
{
//初始化数组
int len=10000;
int[] nums=new int[len];
for(int i=0;i<len;i++){
nums[i]=(int) Math.round(Math.random() * len);
} Sort sort=new Sort();
//调用native方法
long start=System.currentTimeMillis();
sort.bubble(nums,nums.length);
System.out.println("c cost time:"+(System.currentTimeMillis()-start)); start=System.currentTimeMillis();
sort.jbubble(nums,nums.length);
System.out.println("j cost time:"+(System.currentTimeMillis()-start));
}
} class Sort{
static{
System.loadLibrary("sort");
} /*
* 声明native方法
*/
public native int[] bubble(int[] nums,int len); /**
* java sort
* @param nums
* @param len
* @return
*/
public int[] jbubble(int[] nums,int len){
int i, j;
for(i = 0; i < len; i++)
{
for(j = 0; i + j < len - 1; j++)
{
if(nums[j] > nums[j + 1])
{
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
return nums;
}
}

执行输出:

c cost time:453
j cost time:125

是不是吓你一跳,好不容易把Java和c/c++结合了,却给了这个结果:结合了C/C++比原生的JAVA慢了3倍左右,严重被挫折了!!!

由于目前对C/C++操作不熟练,不方便实验,但从网上查的别人总结大致:不管是java/native还是native/java都比java/java慢,主要是把时间消耗在调用过程转换上了,在把控制权和入口切换给本地方法之前,VM必须做一些额外的操作来创建参数和栈帧。
有兴趣的童鞋可以自己尝试下,看看时间到底去哪儿了?

我本来也想试试的,但c++在windows下获取当前时间的毫秒数我弄的总是不对,如:

#include <stdio.h>
#include <sys/time.h>
long getCurrentTime()
{
struct timeval tv;
gettimeofday(&tv,NULL);
long res= tv.tv_sec * 1000 + tv.tv_usec / 1000;
return res;
} int main()
{
printf("%ld\n",getCurrentTime());
return 0;
}

这个在linux下是OK的,但在windows下总是不对,这难道就是体现了平台差异?! 暂时放弃实验,放弃JNI。

JNI只C性能测试的更多相关文章

  1. Android JNI 数组操作

    JNI 中有两种数组操作,基础数据类型数组和对象数组,JNI 对待基础数据类型数组和对象数组是不一样的. 基本数据类型数组 对于基本数据类型数组,JNI 都有和 Java 相对应的结构,在使用起来和基 ...

  2. 性能测试--测试流程、APDEX、linux性能知识

    测试流程.APDEX.linux性能知识 一.性能测试流程: 整体流程:收集需求-->搭建测试环境-->设计性能测试场景-->开发测试脚本-->执行测试-->收集数据-- ...

  3. Android jni/ndk编程一:jni初级认识与实战体验

    Android平台很多地方都可以看到jni的身影,比如之前接触到一个投屏的项目,主要的代码是c/c++写的,然后通过Jni供Java层调用;另外,就拿Android系统中的Service来说,很多的S ...

  4. c++可视化性能测试

    阅读前注意 本文所有代码贴出来的目的是帮助大家理解,并非是要引导大家跟写,许多环境问题文件问题没有详细说明,代码也并不全面,达不到跟做的效果.建议直接阅读全文即可,我在最后会给出详细代码地址,对源代码 ...

  5. loadrunner录制的时候如何应对验证码的问题解决办法?

    对这个问题,我个人的看法是,基本上可以考虑从三个途径来解决该问题: 1.第一种方法,也是最容易想到的,在被测系统中暂时屏蔽验证功能,也就是说,临时修改应用,无论用户输入的是什么验证码,都认为是正确的. ...

  6. Python 操作 Excel,总有一个模块适合自己

    最近在写性能相关的测试脚本,脚本已经完成,最终怎么体现在报告上,要想让报告看起来漂亮些,我们是先创建一个模板(格式和公式已全部制作好),只需要性能测试完成后往对应的sheet页中填充数据,数据完成后最 ...

  7. 交叉编译多平台 FFmpeg 库并提取视频帧

    原文地址: 交叉编译多平台 FFmpeg 库并提取视频帧 交叉编译多平台 FFmpeg 库并提取视频帧 本文档适用于 x86 平台编译 armeabi.armeabi-v7a.arm64-v8a.x8 ...

  8. DEVOPS技术实践_13:使用Jenkins持续传送设计-CD基础

    1. 分支策略 持续集成中使用的分支策略包括以下三个: The master branch The integration branch The feature branch 而CD只在Integra ...

  9. JNI-Thread中start方法的调用与run方法的回调分析

    前言 在java编程中,线程Thread是我们经常使用的类.那么创建一个Thread的本质究竟是什么,本文就此问题作一个探索. 内容主要分为以下几个部分 1.JNI机制的使用 2.Thread创建线程 ...

随机推荐

  1. iOS 之 KVC KVO

    KVC:键值编码,是一种间接访问对象实例变量的机制,可以不通过存取方法(getter setter)就可以访问实例变量. KVO: 属性变化的通知机制

  2. win7配置自己的IIS服务器亲自做的图文很详细

    跟人网站爱好初学者必看的win7系统配置自己的IIS,可以在你自己的电脑上配置网站服务器发不到网上,下面就跟着我的步骤一起做吧100%成功. 步骤/方法     点击开始-------控制面板这个就是 ...

  3. IIS 挂载android的apk文件进行下载

    需要进行MIME的映射处理: 添加MIME映射:文件扩展名:.apk,MIME文件类型:application/vnd.android

  4. 关于如何正确地在android项目中添加第三方jar包

    在android项目中添加第三方jar包虽然不是一个很复杂的问题,但是确实给很多开发者带来了不小的困扰.我自己就曾经碰到过calss not found exception.error inflati ...

  5. 黑客常用的windows注册表大全

    目录 使系统没有"运行"选项                        1让操作系统无"关闭系统" 选项                    2让操作系统 ...

  6. SQL SERVER 运维日记-数据库备份

    概述 昨天下午突然看到,<炉石传说>游戏数据库发生宕机并引发数据丢失事故的新闻.刚看到时,满满的不可思议.暴雪啊,网易啊. 都是很牛叉的公司.他们出的游戏我都是很喜欢的. 当我看到,第一时 ...

  7. linux 中用python实现终端命令行命令

    在python代码中实现和在终端中输入的命令行一样的效果,以命令(audacious -p &)为例,该代码实现用audacious在后台播放音乐的功能,当然前提是安装了audacious. ...

  8. 基于ssh反向代理实现的远程协助

    本文描述了怎么通过ssh反向代理实现远程协助,并提供了相关代码. 可满足web开启远程协助功能后,维护人员能够通过ssh和http登录客户机器(包括在nat环境下) web开启该功能后,ssh才能登录 ...

  9. Wireshark网络抓包(四)——工具

    一.基本信息统计工具 1)捕获文件属性(Summary) 1. File:了解抓包文件的各种属性,例如抓包文件的名称.路径.文件所含数据包的规模等信息 2. Time:获悉抓包的开始.结束和持续时间 ...

  10. 性能优化之数据存储&DOM编程

    多读书多看报 数据存储 ·在javascript中,数据存储的位置会对代码整体性能产生重大的影响. ·数据存储共有4种方式:字面量.变量.数组.对象成员.   ·要理解变量的访问速度,就要理解作用域. ...