gpt4 book ai didi

java - 为什么插入空 ArrayList 比插入非空 ArrayList 花费更多时间?

转载 作者:行者123 更新时间:2023-12-01 16:59:22 27 4
gpt4 key购买 nike

我运行了我的探查器程序 1000 次迭代,以计算插入 Empty ArrayList 所需的平均时间。以及插入 Non-Empty ArrayList 的平均时间。我运行了我的探查器程序 ArrayList<Item> ,其中Item类是

class Item{
int id;
String name;
}

分析器程序类似于

main(){
final int iterations = 1000;

/**** Empty List Insert ****/
int id = 0;
long[] timerecords = new long[iterations];
ArrayList<Item> list = new ArrayList<>();
for (int i = 0; i < iterations; i++) {
long stime = System.nanoTime(); //Start Time
list.add(new Item(id, "A"));
long elapsedTime = System.nanoTime() - stime; //Elapsed time
timerecords[i] = elapsedTime; //Record Elapsed time

//reset
list.clear();
}
System.out.println("Empty List Insert Takes = " + getAverageTime(timerecords) + " nanoseconds");

/**** Non-Empty List Insert ****/
list = new ArrayList<>();
timerecords = new long[iterations];
//Insert some Items
list.add(new Item(id++, "B")); list.add(new Item(id++, "R"));
list.add(new Item(id++, "H")); list.add(new Item(id++, "C"));

for (int i = 0; i < iterations; i++) {
Item item = new Item(id, "A");
long stime = System.nanoTime(); //Start Time
list.add(item);
long elapsedTime = System.nanoTime() - stime; //Elapsed time
timerecords[i] = elapsedTime; //Record Elapsed time

//reset
list.remove(item);
}
System.out.println("Non-Empty List Insert Takes = " + getAverageTime(timerecords) + " nanoseconds");
}

哪里getAverageTime(long [] timerecords)方法以双倍形式返回平均时间。运行该程序几次后,我发现插入空 ArrayList 比插入非空 ArrayList 花费更多时间。其中一个这样的运行输出是

Empty List Insert Takes = 1027.781 nanoseconds
Non-Empty List Insert Takes = 578.825 nanoseconds

这背后的原因是什么?

最佳答案

差异是由于实例创建(new Item())而产生的。

  long stime = System.nanoTime(); //Start Time
list.add(new Item(id, "A")); // at this point two things are happening
// creation of instance & addition into ArrayList
// both takes their own time.

long elapsedTime = System.nanoTime() - stime; //Elapsed time

创建 stime 变量的点就是计时器启动的点。您肯定会向列表中添加新项目。但在第一种情况下,在你执行 System.nanoTime(); 之前您在添加(分配 stime 变量后)时对 Item 调用 new 运算符,这会花费额外的时间。在第二种情况下,您在执行 System.nanoTime(); 之前执行此操作。

    Item item = new Item(id, "A");
long stime = System.nanoTime(); //Start Time
list.add(item);
long elapsedTime = System.nanoTime() - stime; //Elapsed time

因此,仅捕获将项目对象添加到 ArrayList 的时间。

关于java - 为什么插入空 ArrayList 比插入非空 ArrayList 花费更多时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28912871/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com