gpt4 book ai didi

java - 我怎样才能减少这个循环的执行时间(java)

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:36:22 25 4
gpt4 key购买 nike

我有一段代码似乎需要花费不寻常的时间来执行。我需要尽可能降低执行速度。

基本上,代码执行以下操作。我创建了一个对象数组 size[10][10][10]。该对象包含如下数字列表:

class MyClass{
ArrayList<Integer> numberList;
public MyClass(){
numberList= new ArrayList <Integer> ();
}
}


MyClass storage[][][] = new MyClass[10][10][10];

然后我有以下代码将数字添加到列表中

 for(int i =0; i < 200000;i++){
for(int j = 0; j < 10; j++){
for(int k = 0; k < 10; k++){
for(int l = 0; l < 10; l++){
storage[j][k][l].numberList.add(i);
}
}
}
}

我相当确定绝大多数执行时间来自以下行

 storage[j][k][l].numberList.add(i);

更具体地说,它是 .add(i) 。

我是 Java 的新手,只熟悉 C++。如果 ArrayList 类似于 C++ 中的列表,那么向末尾添加一个元素肯定需要很少的 CPU 时间吗?仅仅是因为我做了很多添加操作(可能是一百万)吗?

我想问的另一件事是我可以通过使用线程来加快速度吗? (假设双核处理器有 4 个线程)我想我可以创建 4 个线程,每个线程处理 50,000 个 block 。但是,我不确定同步。大概我必须在 storage[][][] 上有一些互斥。我需要写吗

synchronized(storage)

或者这样可以吗?

synchronized(storage[j][k][l])

非常感谢任何帮助

问候

最佳答案

在处理内存中数以千万计的数据时,永远不要永远使用默认的 Java 包装器类,这些数据也可以作为基元存储。

这是搬起石头砸自己脚的最可靠方法:去过那里,做过那件事。

new ArrayList <Integer>

可以简单地替换为 Trove 的 TIntArrayList:

new TIntArrayList

您下载 Trove,它基本上是一个单行更改,可以在您执行您正在做的事情时节省大量内存。

帮助正确看待事情:

    final int n = 10000000;

final List<Integer> l1 = new ArrayList<Integer>( n );
for (int i = 0; i < n; i++) {
l1.add( i );
}

final TIntArrayList l2 = new TIntArrayList( n );
for (int i = 0; i < n; i++) {
l2.add( i );
}

第一个循环,使用无意义的默认 Java 原语包装器来保存 1000 万个整数,在我的机器上执行需要 4320 毫秒。

第二个需要 41 毫秒。

所以这比两个数量级快。

天真的想法是:“两者都是 O(1)”

事实是:两者都是 O(1),但我使用的是任何一天运行快两个数量级的版本。

关于java - 我怎样才能减少这个循环的执行时间(java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4006035/

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