BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #35464同步于 2014/10/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

java与c性能对比,求大神优化

stonesea
2014/10/21镜像同步15 回复
最近写了个数组矩阵乘法来测试一下c跟java的性能对比[ema3] 具体代码如下,就是1000*1000的两个矩阵相乘,看一下运行时间,结果发现java慢出翔了,java用时在19532ms,c在11295ms,到了3000*3000的矩阵的时候java是794298ms,c是389397ms,java这是被完爆了呀。可是一直纳闷不应该这么慢呀[ema1][ema1] 尝试了更改优化JIT触发次数,还是没有明显的效果,求java版大神指点!!![ema0][ema0] [ema3]c代码: #include<stdio.h> #include<stdlib.h> #include<time.h> using namespace std; #define MAX_LENGTH 3000 double a[MAX_LENGTH][MAX_LENGTH]; double b[MAX_LENGTH][MAX_LENGTH]; double c[MAX_LENGTH][MAX_LENGTH]; void init(double a[MAX_LENGTH][MAX_LENGTH],double b[MAX_LENGTH][MAX_LENGTH]) { for (int i=0;i<MAX_LENGTH;i++) { for (int j=0;j<MAX_LENGTH;j++) { a[i][j]=1.1; b[i][j]=1.1; } } } void multiply(double a[MAX_LENGTH][MAX_LENGTH],double b[MAX_LENGTH][MAX_LENGTH],double c[MAX_LENGTH][MAX_LENGTH]) { for(int i = 0;i<MAX_LENGTH ;i++) { for(int j = 0;j<MAX_LENGTH;j++) { double temp = 0; for(int k = 0;k<MAX_LENGTH;k++) { temp+=a[i][k]*b[k][j]; } c[i][j] = temp; } } } int main() { clock_t start,end; start=clock(); init(a,b); multiply(a,b,c); end=clock(); double duration=(double)(end-start)/CLOCKS_PER_SEC; printf("%f seconds\n",duration); system("pause"); } [ema3]java代码: public class performance_test { private static final int MAX_LENGTH = 3000; double [][]a=new double[MAX_LENGTH][MAX_LENGTH]; double [][]b=new double[MAX_LENGTH][MAX_LENGTH]; double [][]c=new double[MAX_LENGTH][MAX_LENGTH]; public void init(double[][]a,double[][]b){ for(int i=0;i<MAX_LENGTH;i++) { for(int j=0;j<MAX_LENGTH;j++) { a[i][j]=1.1; b[i][j]=1.1; } } } public void multiply(double[][]a,double[][]b,double[][]c) { for(int i = 0;i<a.length ;i++) { for(int j = 0;j<b[0].length;j++) { double temp = 0; for(int k = 0;k<b.length;k++) { temp+=a[i][k]*b[k][j]; } c[i][j] = temp; } } } public static void main(String[] args) { // TODO Auto-generated method stub performance_test test = new performance_test(); long pre=System.currentTimeMillis(); test.init(test.a,test.b); test.multiply(test.a, test.b,test.c); long post=System.currentTimeMillis(); long time=post-pre; System.out.print(time+"\n"); } }
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
Mizones机器人#1 · 2014/10/21
等待大神出现[ema0]
rancho机器人#2 · 2014/10/22
话说我们计算方法老师讲过,一般矩阵乘法优化空间很小,最快的算法也大概只有n^2.7的时间复杂度。 所谓的优化,也只不过是尽量把乘法改写成加法,给一个小白级别的建议,可以把矩阵分块,如果是阶数整数的话(我说的是1024这种整数哈),可以比较方便分。 不过看到楼主用的是两个一样的矩阵相乘,如果是两个或两个以上的一样的矩阵相乘,可以考虑对角化。 针对C和java编译原理方面的优化就不会了,上面的只是提供算法上一点小小建议,我只知道,如果C那种按行排的二维矩阵的话,矩阵相乘可以先反转再乘,执行起来会快一点。 渣渣说的不一定对,可以忽略。
stonesea机器人#3 · 2014/10/22
非常感谢~~~[ema3]不过我问题的主要点是想搞清楚同样的计算量java为什么比c慢这么多,有没有底层的办法提升java的速度,不是通过算法来优化。 【 在 rancho 的大作中提到: 】 : 话说我们计算方法老师讲过,一般矩阵乘法优化空间很小,最快的算法也大概只有n^2.7的时间复杂度。 : 所谓的优化,也只不过是尽量把乘法改写成加法,给一个小白级别的建议,可以把矩阵分块,如果是阶数整数的话(我说的是1024这种整数哈),可以比较方便分。 : 不过看到楼主用的是两个一样的矩阵相乘,如果是两个或两个以上的一样的矩阵相乘,可以考虑对角化。 : ...................
rancho机器人#4 · 2014/10/23
虚拟机跑你要啥自行车? 【 在 stonesea 的大作中提到: 】 : 非常感谢~~~不过我问题的主要点是想搞清楚同样的计算量java为什么比c慢这么多,有没有底层的办法提升java的速度,不是通过算法来优化。
stonesea机器人#5 · 2014/10/23
不仅自行车还想要手表怎么办。。。。 【 在 rancho 的大作中提到: 】 : 虚拟机跑你要啥自行车?
nuanyangyang机器人#6 · 2014/10/23
要真是计算密集型的东西,用GPU吧。
stonesea机器人#7 · 2014/10/24
嗯~~ 【 在 struts 的大作中提到: 】 : java是玩数据库的,系统瓶颈在数据库不在cpu的 : 不是用于密集计算的
stonesea机器人#8 · 2014/10/24
谢暖神~~ 【 在 nuanyangyang 的大作中提到: 】 : 要真是计算密集型的东西,用GPU吧。
wmtws9dsj机器人#9 · 2014/10/24
让我想到了cache miss