我有一段代码似乎需要花费不寻常的时间来执行。我需要尽可能降低执行速度。
基本上,代码执行以下操作。我创建了一个对象数组 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/