首先製作兩個不同物件複製的物件分別是 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 之實驗結果如下:
完整專案(連結)
文章標籤
全站熱搜