![](/img/trans.png)
[英]why the running time of the LinkedList and the ArrayList are not the same
[英]Why the first time to add object into ArrayList or LinkedList require much more time?
為什么第一次將對象添加到ArrayList或LinkedList需要更多時間?
我正在測試ArrayList和LinkedList的性能。 結果是我所期望的。 ArrayList通常更適合隨機訪問,每次插入LinkedList都需要相似的時間。 但是我發現第一次將對象添加到ArrayList或LinkedList 所需的時間比其他時間要多得多。
我已經在Mac和Linux上測試了代碼,情況相似。 您可以從此處下載代碼和完整結果。
java PlayArrayList
0 to 10, elapsedTime: 716362
10 to 20, elapsedTime: 19765
20 to 30, elapsedTime: 10895
$ java PlayLinkedList
0 to 10, elapsedTime: 704209
10 to 20, elapsedTime: 5867
20 to 30, elapsedTime: 5378
PS:它們以納秒為單位測量。
/* Untilty Class for measuring elapsed time */
public class BenmarkTimer {
private long startTime;
private long endTime;
/* Getter */
public long getStartTime(){
return startTime;
}
public long getEndTime(){
return endTime;
}
/* Setter */
private void setStartTime(long t){
startTime = t;
}
private void setEndTime(long t){
endTime = t;
}
/* Method */
public void start(){
setStartTime(System.nanoTime());
}
public long end(){
setEndTime(System.nanoTime());
return getDuration();
}
public void cancel(){
setStartTime(0);
setEndTime(0);
}
public long getDuration(){
return getEndTime() - getStartTime();
}
/* Unit testing */
public static void main (String [] args){
BenmarkTimer timer = new BenmarkTimer();
timer.start();
System.out.println("Hello, World for timer");
timer.end();
long t = timer.getDuration();
System.out.println("Start time "+ timer.getStartTime());
System.out.println("End time "+ timer.getEndTime());
System.out.println("Elaped time "+ t);
}
}
import java.util.*;
public class PlayArrayList{
private int itemCount;
private BenmarkTimer timer;
private List<Integer> list;
public PlayArrayList(){
itemCount = 0;
timer = new BenmarkTimer();
list = getList();
}
public long addTenIntegers(){
timer.start();
for (int i=itemCount; i<(itemCount + 10); i++ ) {
list.add(i);
}
long elapsedTime = timer.end();
itemCount += 10;
return elapsedTime;
}
public long randomRemove(){
Random r = new Random();
int s = list.size();
int i = r.nextInt(s);
timer.start();
list.remove(i);
return timer.end();
}
public String toString(){
return list.toString();
}
/* Factory method */
protected List<Integer> getList(){
return new ArrayList<Integer>();
}
public static void main (String [] args){
PlayArrayList playAList = new PlayArrayList();
/* Add 99 integers */
long elapsedTime;
for (int i=0; i<10; i++){
elapsedTime = playAList.addTenIntegers();
System.out.print(i*10 + " to " + (i*10+10));
System.out.println(", elapsedTime: "+ elapsedTime);
}
System.out.println("Array content");
System.out.println(playAList.toString());
/* Remove 99 integer */
for (int i=0; i<99; i++){
elapsedTime = playAList.randomRemove();
System.out.print("Remove a integer");
System.out.println(", elapsedTime: "+ elapsedTime);
}
}
}
import java.util.*;
public class PlayLinkedList extends PlayArrayList{
/* Factory method */
@Override
protected List<Integer> getList(){
return new LinkedList<Integer>();
}
public static void main (String [] args){
PlayLinkedList playAList = new PlayLinkedList();
/* Add 99 integers */
long elapsedTime;
for (int i=0; i<10; i++){
elapsedTime = playAList.addTenIntegers();
System.out.print(i*10 + " to " + (i*10+10));
System.out.println(", elapsedTime: "+ elapsedTime);
}
System.out.println("Array content");
System.out.println(playAList.toString());
/* Remove 99 integer */
for (int i=0; i<99; i++){
elapsedTime = playAList.randomRemove();
System.out.print("Remove a integer");
System.out.println(", elapsedTime: "+ elapsedTime);
}
}
}
我想這個問題的主要原因是從這里開始的規則4,即新類的初始化效果。 我首先創建了另一個對象來進行初始化操作。 第一次使用的類始終需要更長的時間進行初始化。 此后,操作時間將大大縮短。
PlayArrayList playAListInit = new PlayArrayList();
long firstTime = playAListInit.addTenIntegers();
System.out.println("First time: "+ firstTime);
PlayArrayList playAList = new PlayArrayList();
然后結果將如下所示:
java PlayArrayList
First time: 710000
0 to 10, elapsedTime: 6000
10 to 20, elapsedTime: 12000
20 to 30, elapsedTime: 9000
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.