深入学习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. 网站安全配置(Nginx)防止网站被攻击(包括使用了CDN加速之后的配置方法)

    原文链接:http://www.bzfshop.net/article/176.html 网站被攻击是一个永恒不变的话题,网站攻击的方式也是一个永恒不变的老套路.找几百个电脑(肉鸡),控制这些电脑同时 ...

  2. python 循环使用 while 或 for 语句实现用户名密码输错三次退出

    如有错误欢迎大家指出,新手初来乍到.程序没那么复杂,是最简单的. 一.需求 编写登录文件 .py1. 输入用户名密码2. 正确,输出欢迎登录3. 当输入用户名和密码小于 3 次,输入用户名或者密码错误 ...

  3. Tamper Data 安装与使用

    Tamper Data概览   注意:我将会讲述一些有关Tamper Data的基本常识,包括它的基本功能,如何安装等. Tamper Data是什么?   Tamper Data 的真实含义,即&q ...

  4. JAVA轻量级文件监控

    原文地址:http://blog.csdn.net/three_man/article/details/31012903?utm_source=tuicool 介绍 本文主要介绍一种轻量级的文件监控方 ...

  5. 【开发必备】今天我们来谈谈Android NDK动态链接库(so文件)的一些见解

    一.写在前面 直到现在,基本我写的每一个项目都会用到NDK动态链接库的知识,可见这个也的确十分常用.那么,今天,咱们就来谈谈它. 二.什么是ABI和so 1.发展 早起的Android系统几乎只支持A ...

  6. PowerShell:因为在此系统上禁止运行脚本

    在安装chocolatey(官网)的时候,不能运行chocolateyInstall.pal脚本文件. 查阅资料后,得出如下解决办法: 首次在计算机上启动 Windows PowerShell 时,现 ...

  7. 使用 Passenger +Apache扩展 Puppet,代替其Webrick的web框架

    使用 Passenger +Apache扩展 Puppet,代替其Webrick的web框架 1安装 yum install ruby-devel ruby-libs rubygems libcurl ...

  8. 服务器部署项目出现问题:Unsupported major.minor version 52.0

    问题描述: 编写一个web 前置服务,使用ant编译项目,将项目部署到服务器上,启动时报此错误:Unsupported major.minor version 52.0 网上给出错误原因是服务器安装的 ...

  9. Ubuntu 制作U盘启动盘

    部门需要一台Linux系统远程共享服务器,需要一个启动盘安装.但是由于公司windows 系统都安装了保安软件,而且软件的使用也是有限制的.所以不能使用UltraISO 这类软件制作U盘启动盘.还好部 ...

  10. Python学习--16 正则表达式

    正则表达式是一种描述性的语言,用来匹配字符串.凡是符合规则的字符串,我们认为就是匹配了. 正则表达式并非Python独有的,它与语言无关.很多语言都支持正则表达式. 我们经常用正则表达式来匹配电子邮件 ...