本帖最后由 了无尘 于 2012-3-29 00:11 编辑
刚才看数组排序那,老毕说了一句话,我相信很多人都应该没注意,就是效率,怎么减少堆内存中置换次数来提高性能,这句话我没理解什么意思,不过自己想了下,其实有些时候没必要进入循环的,所以我就做了点改动,改完之后发现效率提高到惊人的66%。。。。
我的问题是,这样改动之后提高效率的根源具体在底层内会造成什么效果
这个只能先拿这个数组演示下了,至于乱序数组排序是不正确的,不过这里就是看下是否会有提升效率
下边是代码- public class Sort
- {
- public static void main(String[] args)
- {
- int[] arr = {8,7,6,5,4,3,2,1};
- long taken = System.currentTimeMillis();
- for(int i = 0; i < 100000000; i++)
- {
- arr = new int[]{8,7,6,5,4,3,2,1};
- selectSort(arr);
- }
- taken = System.currentTimeMillis() - taken;
- System.out.println("selectSort方法耗时:"+taken+" 毫秒");
-
- taken = System.currentTimeMillis();
- for(int i = 0; i < 100000000; i++)
- {
- arr = new int[]{8,7,6,5,4,3,2,1};
- selectSort2(arr);
- }
- taken = System.currentTimeMillis() - taken;
- System.out.println("selectSort2方法耗时:"+taken+" 毫秒");
- }
- public static void selectSort(int[] arr)
- {
- for(int i = 0; i < arr.length - 1; i++)
- {
- for(int j = i + 1; j < arr.length; j++)
- {
- if(arr[i] > arr[j])
- {
- swap(arr, i, j);
- }
- }
- }
- }
-
- public static void selectSort2(int[] arr)
- {
- for(int i = 0; i < arr.length - 1; i++)
- {
- for(int j = i + 1; j < arr.length && arr[i] > arr[j]; j++)
- {
- swap(arr, i, j);
- }
- }
- }
-
- public static void swap(int[] arr, int i, int j)
- {
- int temp = arr[i];
- arr[i] = arr[j];
- arr[j] = temp;
- }
- }
复制代码- selectSort方法耗时:4119 毫秒
- selectSort2方法耗时:2473 毫秒
复制代码 我又想了想,内循环每次都要创建一个j变量,那么果断的把他拿到外循环定义- public static void selectSort3(int[] arr)
- {
- for(int i = 0,j = i + 1; i < arr.length - 1; i++)
- {
- for(j = i + 1; j < arr.length && arr[i] > arr[j]; j++)
- {
- swap(arr, i, j);
- }
- }
- }
复制代码 这样比原来还能提高3%左右,但是还有个地方可以优化,外循环的j=i+1,实际上只需要执行一次,那么就是常量1- public static void selectSort3(int[] arr)
- {
- for(int i = 0,j = 1; i < arr.length - 1; i++)
- {
- for(j = i + 1; j < arr.length && arr[i] > arr[j]; j++)
- {
- swap(arr, i, j);
- }
- }
- }
复制代码 但是最后这个改动,在这种亿次级别的情况下也仅是减少几毫秒的时间,不是很明显 |