首先製作兩個不同物件複製的物件分別是 Employee 使用序列化(Serialize)方法進行複製物件,以及Worker 使用Clonelone 進行物件複製。

並分別使用Clone 方法將物件進行複製,量測各自運算所需時間,取得效能比較之結果。

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class Employee implements Serializable{
	private static final long serialVersionUID = 3049633059823371192L;
	private String name;
	private int age;
	
	public Employee(String name,int age) {
		this.name = name;
		this.age = age;
	}
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		StringBuilder sb = new StringBuilder();
		sb.append("姓名 : " + name + " ");
		sb.append("年齡 : " + age + "\n");
		return sb.toString();
	}
	
	@Override
	protected Employee clone() {
		// TODO Auto-generated method stub
		Employee employee = null;
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		
		try {
			ObjectOutputStream oos = new ObjectOutputStream(baos);
			oos.writeObject(this);
			oos.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
		
		try {
			ObjectInputStream ois = new ObjectInputStream(bais);
			employee = (Employee) ois.readObject();
			ois.close();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return employee;
	}
}

 

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class Worker implements Cloneable{
	private String name;
	private int age;
	
	public Worker(String name,int age) {
		this.name = name;
		this.age = age;
	}
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		StringBuilder sb = new StringBuilder();
		sb.append("姓名 : " + name + " ");
		sb.append("年齡 : " + age + "\n");
		return sb.toString();
	}
	
	@Override
	protected Worker clone()  {
		// TODO Auto-generated method stub
		Worker worker = null;
		try {
			worker = (Worker) super.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return worker;
	}
}

 

由於電腦運算速度過快,物件複製的時間非常快速,因此難以確認其時間差異,因此透過多次複製累積時間差,進而有效進行實驗。

CLONE_TIME 為複製的次數,次數越多,時間差異被放大的越大,但是實驗所需要耗費的時間將越長。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Test {
	public static void main(String[] args) {
		final int CLONE_TIME = 100000;
		long currentTime = 0;
		List<Worker> workers = new ArrayList<Worker>();
		List<Employee> employees = new ArrayList<Employee>();
		
		Worker worker = new Worker("worker", 16);
		Employee employee = new Employee("employee", 22);
	
		currentTime = System.currentTimeMillis();
		for(int i=0;i<CLONE_TIME;i++)
			workers.add(worker.clone());
		System.out.println("使用複製域方法實現複製所耗費的時間 : ");
		System.out.println(System.currentTimeMillis() - currentTime + " ms");
		
		currentTime = System.currentTimeMillis();
		for(int i=0;i<CLONE_TIME;i++)
			employees.add(employee.clone());
		System.out.println("使用序列化方法實現複製所耗費的時間 : ");
		System.out.println(System.currentTimeMillis() - currentTime + " ms");
	
	}
}

 

實驗設備 i7 -9700 KF,使用 CLONE_TIME = 100000 之實驗結果如下:

image

 

完整專案(連結)

arrow
arrow
    文章標籤
    java
    全站熱搜
    創作者介紹
    創作者 Lung-Yu,Tsai 的頭像
    Lung-Yu,Tsai

    Lung-Yu,Tsai 的部落格

    Lung-Yu,Tsai 發表在 痞客邦 留言(0) 人氣()