2021-01-15

为什么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秒

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值