返回信息流最近写了个数组矩阵乘法来测试一下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");
}
}
这是一条镜像帖。来源:北邮人论坛 / java / #35464同步于 2014/10/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
java与c性能对比,求大神优化
stonesea
2014/10/21镜像同步15 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
话说我们计算方法老师讲过,一般矩阵乘法优化空间很小,最快的算法也大概只有n^2.7的时间复杂度。
所谓的优化,也只不过是尽量把乘法改写成加法,给一个小白级别的建议,可以把矩阵分块,如果是阶数整数的话(我说的是1024这种整数哈),可以比较方便分。
不过看到楼主用的是两个一样的矩阵相乘,如果是两个或两个以上的一样的矩阵相乘,可以考虑对角化。
针对C和java编译原理方面的优化就不会了,上面的只是提供算法上一点小小建议,我只知道,如果C那种按行排的二维矩阵的话,矩阵相乘可以先反转再乘,执行起来会快一点。
渣渣说的不一定对,可以忽略。
非常感谢~~~[ema3]不过我问题的主要点是想搞清楚同样的计算量java为什么比c慢这么多,有没有底层的办法提升java的速度,不是通过算法来优化。
【 在 rancho 的大作中提到: 】
: 话说我们计算方法老师讲过,一般矩阵乘法优化空间很小,最快的算法也大概只有n^2.7的时间复杂度。
: 所谓的优化,也只不过是尽量把乘法改写成加法,给一个小白级别的建议,可以把矩阵分块,如果是阶数整数的话(我说的是1024这种整数哈),可以比较方便分。
: 不过看到楼主用的是两个一样的矩阵相乘,如果是两个或两个以上的一样的矩阵相乘,可以考虑对角化。
: ...................
虚拟机跑你要啥自行车?
【 在 stonesea 的大作中提到: 】
: 非常感谢~~~不过我问题的主要点是想搞清楚同样的计算量java为什么比c慢这么多,有没有底层的办法提升java的速度,不是通过算法来优化。