JNI只C性能测试
深入学习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性能测试的更多相关文章
- Android JNI 数组操作
JNI 中有两种数组操作,基础数据类型数组和对象数组,JNI 对待基础数据类型数组和对象数组是不一样的. 基本数据类型数组 对于基本数据类型数组,JNI 都有和 Java 相对应的结构,在使用起来和基 ...
- 性能测试--测试流程、APDEX、linux性能知识
测试流程.APDEX.linux性能知识 一.性能测试流程: 整体流程:收集需求-->搭建测试环境-->设计性能测试场景-->开发测试脚本-->执行测试-->收集数据-- ...
- Android jni/ndk编程一:jni初级认识与实战体验
Android平台很多地方都可以看到jni的身影,比如之前接触到一个投屏的项目,主要的代码是c/c++写的,然后通过Jni供Java层调用;另外,就拿Android系统中的Service来说,很多的S ...
- c++可视化性能测试
阅读前注意 本文所有代码贴出来的目的是帮助大家理解,并非是要引导大家跟写,许多环境问题文件问题没有详细说明,代码也并不全面,达不到跟做的效果.建议直接阅读全文即可,我在最后会给出详细代码地址,对源代码 ...
- loadrunner录制的时候如何应对验证码的问题解决办法?
对这个问题,我个人的看法是,基本上可以考虑从三个途径来解决该问题: 1.第一种方法,也是最容易想到的,在被测系统中暂时屏蔽验证功能,也就是说,临时修改应用,无论用户输入的是什么验证码,都认为是正确的. ...
- Python 操作 Excel,总有一个模块适合自己
最近在写性能相关的测试脚本,脚本已经完成,最终怎么体现在报告上,要想让报告看起来漂亮些,我们是先创建一个模板(格式和公式已全部制作好),只需要性能测试完成后往对应的sheet页中填充数据,数据完成后最 ...
- 交叉编译多平台 FFmpeg 库并提取视频帧
原文地址: 交叉编译多平台 FFmpeg 库并提取视频帧 交叉编译多平台 FFmpeg 库并提取视频帧 本文档适用于 x86 平台编译 armeabi.armeabi-v7a.arm64-v8a.x8 ...
- DEVOPS技术实践_13:使用Jenkins持续传送设计-CD基础
1. 分支策略 持续集成中使用的分支策略包括以下三个: The master branch The integration branch The feature branch 而CD只在Integra ...
- JNI-Thread中start方法的调用与run方法的回调分析
前言 在java编程中,线程Thread是我们经常使用的类.那么创建一个Thread的本质究竟是什么,本文就此问题作一个探索. 内容主要分为以下几个部分 1.JNI机制的使用 2.Thread创建线程 ...
随机推荐
- 关于IE6、IE7、IE8实现盒子阴影shadow的几个注意点
通常,我们实现盒阴影都是通过这段代码来实现的 -moz-box-shadow: 3px 3px 4px #000; -webkit-box-shadow: 3px 3px 4px #000; box- ...
- Mac下使用Brew搭建PHP(LNMP/LAMP)开发环境
Mac下搭建lamp开发环境很容易,有xampp和mamp现成的集成环境.但是集成环境对于经常需要自定义一些配置的开发者来说会非常麻烦,而且Mac本身自带apache和php,在brew的帮助下非常容 ...
- 响应HttpServletResponse
可以使用HttpServletResponse来对浏览器进行响应,大部分情况下,会使用setContentType()设置响应类型,使用getWriter()取得PrintWriter对象,而后使用P ...
- bootstrap 树
http://jsfiddle.net/jhfrench/GpdgF/ 把原文的i标签中的图标显示出来: 源码: <div class="tree well"> < ...
- C++中定义使用受限的类
1.只能在堆上使用的类 栈上对象通过自动调用析构函数释放空间,将该类的析构函数定义为private就可以阻止其被自动调用,从而阻止在栈上使用该类的对象,为了避免资源泄漏问题,在堆上使用该类的对象时我们 ...
- html标签大全(2)
http标签详解 声明 1:这里的文字都是我从我自己csdn账号拷贝过来,是本人学习总结的结晶,所以请尊重本作品.2:如要要转载本文章,则要说明文字的出处.3:如有哪里不对欢迎指出. 在上一篇文章中主 ...
- Java 导出Excel的各种尝试
最近的一个项目比较忙,一直没时间过来跟新博客.今天过来分享一下在此项目中遇到的一个小问题:导出Excel:相信导出Excel这个功能是特别常见的,也有很多的方式.好了,不多说了,直接说说自己遇到的各种 ...
- 初识JSON
▓▓▓▓▓▓ 大致介绍 JSON(JavaScript Object Notation JavaScript对象表示法),JSON是一种数据格式,不是一种编程语言.虽然它的名字中有JavaScrip ...
- 2017了,回家前 "年末" 分享:下雨,飘雪,红包雨,碰撞球,自定义View
(本博客为原创:http://www.cnblogs.com/linguanh/) 目录: 效果展示 感想 代码拆解 开源地址 效果展示 有没有兴趣继续看下去,直接看下"颜值"是第 ...
- node之路由介绍
路由介绍 ----路由是指向客户端提供它所发出的请求内容的机制:----对基于 Web 的客户端 / 服务器端程序而言,客户端在 URL 中指明它想要的内容,具体来说就是路径和查询字符串 下面我看看一 ...