`
sanyecao2314
  • 浏览: 131523 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

java几种排序方式速度的简单测试

阅读更多

在oschina上看到一篇排序速度测试的(http://my.oschina.net/nox/blog/489993?fromerr=W8001KYQ),但没有测试stream的速度.故增加该测试.

三种排序方式:

1.Collections.sort;

2.forkjoin;

3.stream sort.

上代码:

package sort;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
import java.util.stream.Collectors;

public class GenerateSample {
	public static void main(String[] args) {
		writeFile();
		
		long t1 = System.currentTimeMillis();
		sort();
		long t2 = System.currentTimeMillis();
		System.out.println("sort total time=" + (t2-t1));
		forkJoin();
		long t3 = System.currentTimeMillis();
		System.out.println("forkjoin total time=" + (t3-t2));
		stream();
		long t4 = System.currentTimeMillis();
		System.out.println("stream total time=" + (t4-t3));
	}

	public static void writeFile() {
		File f = new File("/home/novelbio/tmp/sample.txt");
		FileWriter writer;
		try {
			writer = new FileWriter(f, false);
			Random random1 = new Random(10);
			for (int i = 0; i < 10000000; i++) {
				writer.write(String.valueOf(random1.nextInt(20000)));
				writer.write("\r\n");
			}

			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {

		}
	}

	public static void sort() {
		File f = new File("/home/novelbio/tmp/sample.txt");
		List<Integer> arrayList = new ArrayList<>();
		BufferedReader reader = null;
		try {
			reader = new BufferedReader(new FileReader(f));
			String str = null;
			while ((str = reader.readLine()) != null) {
				arrayList.add(Integer.valueOf(str));
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				reader.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		long startTime = System.currentTimeMillis();
		Collections.sort(arrayList);
		long endTime = System.currentTimeMillis();

		System.out.println("基本sort排序所花时间:" + (endTime - startTime) + "ms");

		File f2 = new File("/home/novelbio/tmp/original_sorted.txt");
		FileWriter writer2;
		try {
			writer2 = new FileWriter(f2, false);

			for (int i = 0; i < arrayList.size(); i++) {
				writer2.write(String.valueOf(arrayList.get(i)));
				writer2.write("\r\n");
			}

			writer2.close();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {

		}
	}

	public static void forkJoin() {
		File f = new File("/home/novelbio/tmp/sample.txt");
		List<Integer> arrayList = new ArrayList<>();
		BufferedReader reader = null;
		try {
			reader = new BufferedReader(new FileReader(f));
			String str = null;
			while ((str = reader.readLine()) != null) {
				arrayList.add(Integer.valueOf(str));
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				reader.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		long longArray[] = new long[arrayList.size()];
		for (int i = 0; i < arrayList.size(); i++) {
			longArray[i] = Long.parseLong(arrayList.get(i).toString());
		}

		ForkJoinPool pool = new ForkJoinPool();

		FastSort fastSort = new FastSort(longArray);

		long startTime = System.currentTimeMillis();
		pool.execute(fastSort);
		while (!fastSort.isDone()) {

		}

		long endTime = System.currentTimeMillis();

		System.out.println("fockJoin排序所花时间:" + (endTime - startTime) + "ms");
		File f2 = new File("/home/novelbio/tmp/fockJoinSorted.txt");

		FileWriter writer2;
		try {
			writer2 = new FileWriter(f2, false);

			for (int i = 0; i < longArray.length; i++) {
				writer2.write(String.valueOf(longArray[i]));
				writer2.write("\r\n");
			}

			writer2.close();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {

		}

	}
	
	
	public static void stream() {
		File f = new File("/home/novelbio/tmp/sample.txt");
		List<Integer> arrayList = new ArrayList<>();
		BufferedReader reader = null;
		try {
			reader = new BufferedReader(new FileReader(f));

			String str = null;
			while ((str = reader.readLine()) != null) {
				arrayList.add(Integer.valueOf(str));
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				reader.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}



		long startTime = System.currentTimeMillis();
		
		ArrayList<Integer> newlist = (ArrayList) arrayList.stream().sorted((p1, p2) -> (p1 - p2)).collect(Collectors.toList());

		long endTime = System.currentTimeMillis();

		System.out.println("streamSorted排序所花时间:" + (endTime - startTime) + "ms");
		File f2 = new File("/home/novelbio/tmp/streamSorted.txt");

		FileWriter writer2;
		try {
			writer2 = new FileWriter(f2, false);

			for (Integer i : newlist) {
				writer2.write(String.valueOf(i));
				writer2.write("\r\n");
			}

			writer2.close();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {

		}

	}

}

class FastSort extends RecursiveAction {

	private static final long serialVersionUID = 1L;
	
	final long[] array;
	final int lo;
	final int hi;
	private int THRESHOLD = 30;

	public FastSort(long[] array) {
		this.array = array;
		this.lo = 0;
		this.hi = array.length - 1;
	}

	public FastSort(long[] array, int lo, int hi) {
		this.array = array;
		this.lo = lo;
		this.hi = hi;
	}

	protected void compute() {
		if (hi - lo < THRESHOLD)
			sequentiallySort(array, lo, hi);
		else {
			int pivot = partition(array, lo, hi);
			FastSort left = new FastSort(array, lo, pivot - 1);
			FastSort right = new FastSort(array, pivot + 1, hi);

			invokeAll(left, right);
		}
	}

	private int partition(long[] array, int lo, int hi) {
		long x = array[hi];
		int i = lo - 1;
		for (int j = lo; j < hi; j++) {
			if (array[j] <= x) {
				i++;
				swap(array, i, j);
			}
		}
		swap(array, i + 1, hi);
		return i + 1;
	}

	private void swap(long[] array, int i, int j) {
		if (i != j) {
			long temp = array[i];
			array[i] = array[j];
			array[j] = temp;
		}
	}

	private void sequentiallySort(long[] array, int lo, int hi) {
		Arrays.sort(array, lo, hi + 1);
	}
}

 

测试结果如下(每人机器配置不同,花费时间会有不同.):

基本sort排序所花时间:3627ms
sort total time=8176
fockJoin排序所花时间:1345ms
forkjoin total time=5846
streamSorted排序所花时间:2581ms
stream total time=5566

基本结论:

 

基本sort(3627ms)>streamSorted(2581ms)>fockJoin(1345ms)

 

 

 

 

0
1
分享到:
评论

相关推荐

    JAVA排序算法: 直接插入,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序

    JAVA排序算法: 直接插入,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序,包括算法的详细介绍,以及对几种算法的详细测试

    java 内部排序算法的性能分析

    设计一个测试程序比较几种内部排序算法的关键字比较次数和移动次数以取得直观感受。 用java写的,重庆理工大学,软件工程系课程设计

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    各种内部排序算法演示

    我用java做的各种内部排序算法演示,做的不是很好(确实不好),不过挺好玩的,大家看看.Windows中运行Run_Windows.bat(Linux下为Run_linux.sh)自动编译并运行(运行完成自动删除*.class).需要先配置好JDK

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    java开源包11

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包6

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包9

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包4

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包101

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包5

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包8

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包10

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包3

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包1

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java面试题目与技巧1

    │ 164个完整Java代码.zip │ J2EE综合--Struts常见错误的全面汇总.txt │ java程序员面试资料.zip │ JAVA笔试题(上海释锐).pdf │ MIME简介.txt │ SCJP试题详解.pdf │ SQL面试题_心灵深处.htm │ Struts+...

    java面试题及技巧4

    │ 164个完整Java代码.zip │ J2EE综合--Struts常见错误的全面汇总.txt │ java程序员面试资料.zip │ JAVA笔试题(上海释锐).pdf │ MIME简介.txt │ SCJP试题详解.pdf │ SQL面试题_心灵深处.htm │ Struts+...

    java开源包2

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

Global site tag (gtag.js) - Google Analytics