c 与java性能测试_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
#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
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
#include
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。
c 与java性能测试_JNI只C性能测试相关推荐
- 在java中使用JMH(Java Microbenchmark Harness)做性能测试
文章目录 使用JMH做性能测试 BenchmarkMode Fork和Warmup State和Scope 在java中使用JMH(Java Microbenchmark Harness)做性能测试 ...
- 细说Java性能测试第三课 性能测试详解2
如何制定一份有效的性能测试方案? 上一讲我们学习了性能测试的场景,并且明确了每个场景的核心意义,这一讲我将带你学习如何做好一份性能测试方案,相信你对测试方案这个概念并不陌生,那如何做好一份性能测试方案 ...
- java异步刷新集合,同步和异步集合的性能测试,异步集合性能测试,package cn.o
同步和异步集合的性能测试,异步集合性能测试,package cn.opackage cn.outofmemory.snippets.core;import java.util.ArrayList;im ...
- Java性能优化四、性能测试工具
文章目录 推荐几款常用的性能测试工具 1.ab 2.JMeter 3.LoadRunner 总结 推荐几款常用的性能测试工具 常用的性能测试工具有很多,在这里我将列举几个比较实用的. 对于开发人员来说 ...
- 性能测试 性能测试实战(八)Jmeter性能测试平台开发,性能测试平台架构解析 ,性能测试平台搭建 分布式性能压测平台 Jmeter分布式性能测试管理平台 性能测试平台示例案例 《完结篇》
文章目录 一.前言 二.Jmeter分布式性能测试平台 介绍 1.Jmter分布式性能测试平台 简介 2.Jmeter分布式性能测试平台 优秀案例1 3.Jmeter分布式性能测试平台 优秀案例2 4 ...
- 性能测试工具Loadrunner以及性能测试的流程以及每一个步骤的流程和结果分析
[文章末尾给大家留下了大量的福利] 性能测试工具Loadrunner Loadrunner是HP公司研发的性能测试工具,原理是通过刻录传输协议生成脚本,增强脚本以后模拟大量用户并发进行性能测试. 对于 ...
- 【2023最详细】性能测试重点和各项性能测试流程
前言 一.Python编程入门到精通 二.接口自动化项目实战 三.Web自动化项目实战 四.App自动化项目实战 五.一线大厂简历 六.测试开发DevOps体系 七.常用自动化测试工具 八.JMete ...
- 性能测试怎么做?性能测试重点和各项性能测试流程(超级详细)
目录:导读 前言 一.Python编程入门到精通 二.接口自动化项目实战 三.Web自动化项目实战 四.App自动化项目实战 五.一线大厂简历 六.测试开发DevOps体系 七.常用自动化测试工具 八 ...
- 服务器性能测试工具及实战,性能测试实战--《软件测试52讲》
1.性能测试工具常见5组件及作用: 模拟用户行为生成脚本:loadrunner有录制功能,转化为基于协议的请求.jmeter有badboy 压力产生器:可能由于压力产生器本身的性能瓶颈(设备本身也会存 ...
最新文章
- linux系统硬盘坏道,如何在 Linux 系统下检测硬盘上的坏道和坏块
- 命令行修改weblogic用户名和密码
- JavaScript中赋值运算符的使用
- 使用jqprint插件完成页面打印
- H - Great Cells Gym - 101194H(数学推导/思维)
- 目前个人计算机使用的电子电路主要是,计算机基础知识理论题库.xls
- Web Service 学习
- 【转】Django 数据库的操作
- python 学习DAY12
- 可用性测试(用户体验)测试
- JavaScript 运算符
- 第5章 初识SqlSugarCore之内置逻辑分页
- 关于Android开发中图片的三级缓存机制
- 不要小看90后,图片贴纸应用“贴纸”上线17天登大陆摄影与录像类App第3位,下载破15万
- ply补全为立方体_PLY文件格式及其解析 | 学步园
- 结构化软件设计的具体步骤
- 微信小程序-购物车数字加减
- 函数、原生JS的事件相关(上)
- aiwi体感游戏,感受聊斋风情
- edge for android 6.0,Microsoft Edge for Android v44