为什么c语言运行的比java慢这么多???同样的代码,
c语言2千万11秒
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void quickSort(int* a, int left, int right)
{
if (left >= right)
return;
int i = left;
int j = right;
int key = a[left];
while (i < j)
{
while (i < j && key <= a[j])
j--;
a[i] = a[j];
while (i < j && key >= a[i])
i++;
a[j] = a[i];
}
a[i] = key;
quickSort(a, left, i - 1);
quickSort(a, i + 1, right);
}
#define length 20000000
void performanceTest() {
srand(time(0));
int *arr;
arr = (int*)malloc(length * sizeof(int));
for (int i = 0; i < length; i++) {
arr[i] = rand();
}
printf("\n************排序中************");
int t = time(0);
quickSort(arr, 0,length-1);
printf("\n排序耗时%d秒", time(0) - t);
for (int i = 0; i < length; i++) {
if (i % 10000 == 0)
printf("%d\t", arr[i]);
if (i % 100000 == 0)
printf("\n");
}
}
Java 2千万,5秒多
public static void main(String[] args) {
int length =20000000;
int arr[]=new int[length];
Random r = new Random();
Date d = new Date();
long t = d.getTime();
System.out.println(t);
System.out.println("赋值中。。。");
for(int i=0;i<length;i++) {
int next = r.nextInt()%10000;
arr[i] = next*next;
}
System.out.println("赋值耗时"+(new Date().getTime()-t)+"毫秒");
System.out.println("排序中。。。");
t = new Date().getTime();
quickSort(arr,0,length-1);
System.out.println("排序耗时"+(new Date().getTime()-t)+"毫秒");
int j=0;
for(int i:arr){
j++;
if(j%10000==0)
System.out.print(i+"\t");
if(j%100000==0)
System.out.println();
}
}
static void quickSort(int a[],int left,int right){ //就比c语言版本多一个static
if (left >= right)
return;
int i = left;
int j = right;
int key = a[left];
while (i < j)
{
while (i < j && key <= a[j])
j--;
a[i] = a[j];
while (i < j && key >= a[i])
i++;
a[j] = a[i];
}
a[i] = key;
quickSort(a, left, i - 1);
quickSort(a, i + 1, right);
}
今天用Ubuntu跑了c语言的,只要3秒,可能Windows不适合c语言吧
但是我在Ubuntu上跑JAVA的平均只要2.3秒,服了啊,JAVA不是跨平台吗?怎么运行时间不一样?
又跑了4千万,C语言要6秒,JAVA只要4.7秒,
8千万,C语言13秒,java 9.8秒
windows平台没有用gcc,用visual studio自带的调试执行,
难道一个是32位程序,一个是64位程序?
java 更奇怪,为什么window平台Java比Ubuntu的慢
为什么Ubuntu下面,java还是比c语言快。
我发现把Java改为下面
int next = r.nextInt()%100000;
if(next<0)
next = -next;
之后,JAVA排2千万也要3秒多,JAVA 8千万要29秒,c语言也%100000之后 2千万要6秒,8千万为62秒
如果%10000则2千万数字的排序,Java 需要14秒,C语言需要34秒。
看来重复的数字会影响排序性能。但是JAVA仍然比C语言快。
现在我设置所有数字一样,都是888,2百万,JAVA已经报stackoverflow错误!
很奇怪,2千个,8毫秒,2万个报stackoverflow,1万个70毫秒,
看来这个算法有问题,2万个全同数字排序就栈溢出了。
对排好的数组继续排序,1万个68毫秒,2万溢出,看来是与有序度有关
完全顺序的数组长度不能超过一万,完全逆序的数组同样。(因为第一次循环之后,完全逆序的数组就变成完全顺序的数组)
尝试改进,让快速排序可以排有序度(无论顺逆)比较高的数组。
可以看浮标,如果第一次递归时,i值过小或过大(交换次数少),只能说明第一个数过小或过大,以后每一次调用都只能说明这个问题,选的数过小或过大。或许可以先计算平均数?用平均数作为第一次调用的参考数。这样强行,不对,要作为每次递归的参考数,那这样要计算log(2)n次平均数,平均数又是所有数字加起来一共需要n*log(2)n次加法,log(2)n次除法。这还没比较和调换呢!显然不行。
今天发现是debug版本导致运行慢,选择release,2千万,2秒