无意计算机底层原理及JVM底层后,就发现一行代码竟然会让系统性能提升一千倍不止。不是吹牛,本人亲测
优化后:唯一的区别就是将临时变量提取出来,如果是200w+数据,第一种方式需要很久很久很久才会出结果,而加了临时变量后,性能提升千倍不止;
原因分析:频繁的开辟新的空间导致JVM频繁的垃圾回收,导致运行效率下降
个人建议:
在开发中如果需要用到临时变量,最可能避免频繁的开辟大空间,销毁空间,这对系统性能提升有很大很大的帮助
接下来看下归并排序
优化前
package edu.sort;
import java.util.Arrays;
/**
-
归并排序
-
先对数据进行分段,分成一段段的连续的片段,然后采用插入排序进行
-
@author: LHT
-
@date: 2020/12/14 15:24
*/
public class MergeSort {
public static void main(String[] args) {
int[] data = {1, 4, 234, 63, 123, 56234, 21, 213, 4543};
mergeSort(data, 0, data.length - 1);
System.out.print(Arrays.toString(data));}
public static void mergeSort(int data[], int left, int right) {
if (left < right) {
//拆分数组,如果想当,标示只有一个数了。不需要拆分了,
int mid = (left + right) / 2;
mergeSort(data, left, mid);
mergeSort(data, mid + 1, right);
//分完了接下来要合并
merge(data, left, mid, right);
}
}/**
- 合并数据
- @param data 源数据
- @param left 拆分左右边的下标
- @param mid 拆分中间的下标
- @param right 拆分有点的下标
*/
public static void merge(int[] data, int left, int mid, int right) {
int temp[] = new int[data.length]; //借用临时数组存储合并好的数据
int point1 = left;//标示最右边的第一个数据
int point2 = mid + 1;//标示右边的第一个数的位置
int loc = left; //标记我们当前已经到了那个位置
while (point1 <= mid && point2 <= right) {
if (data[point1] < data[point2]) {
temp[loc] = data[point1];
point1++;
loc++;
} else {
temp[loc] = data[point2];
point2++;
loc++;
}
}
//合并数据
while (point1 <= mid) {
temp[loc++] = data[point1++];
}
while (point2 <= right) {
temp[loc++] = data[point2++];
}
//将排好序的数据,赋值给数组
for (int i = left; i <= right; i++) {
data[i] = temp[i];
}
}
}
package edu.sort;
import java.util.Arrays;
/**
-
归并排序
-
先对数据进行分段,分成一段段的连续的片段,然后采用插入排序进行
-
@author: LHT
-
@date: 2020/12/14 15:24
*/
public class MergeSort {
public static int temp[];
public static void main(String[] args) {
int[] data = {1, 4, 234, 63, 123, 56234, 21, 213, 4543};
mergeSort(data, 0, data.length - 1);
System.out.print(Arrays.toString(data));}
public static void mergeSort(int data[], int left, int right) {
if (left < right) {
//拆分数组,如果想当,标示只有一个数了。不需要拆分了,
int mid = (left + right) / 2;
mergeSort(data, left, mid);
mergeSort(data, mid + 1, right);
//分完了接下来要合并
merge(data, left, mid, right);
}
}/**
-
合并数据
-
@param data 源数据
-
@param left 拆分左右边的下标
-
@param mid 拆分中间的下标
-
@param right 拆分有点的下标
*/
public static void merge(int[] data, int left, int mid, int right) {temp = new int[data.length]; //借用临时数组存储合并好的数据
int point1 = left;//标示最右边的第一个数据
int point2 = mid + 1;//标示右边的第一个数的位置
int loc = left; //标记我们当前已经到了那个位置
while (point1 <= mid && point2 <= right) {
if (data[point1] < data[point2]) {
temp[loc] = data[point1];
point1++;
loc++;
} else {
temp[loc] = data[point2];
point2++;
loc++;
}
}
//合并数据
while (point1 <= mid) {
temp[loc++] = data[point1++];
}
while (point2 <= right) {
temp[loc++] = data[point2++];
}
//将排好序的数据,赋值给数组
for (int i = left; i <= right; i++) {
data[i] = temp[i];
}
}
}
-