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

标签 java

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

基本上,代码执行以下操作。我创建了一个对象数组 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/

相关文章:

java - Java布局中的元素都在同一位置

java - 我可以使用套接字列表发送给多个客户端吗?

java - 如何在 Eclipse 中强制 JFace 向导的最小高度?

java - com.fasterxml.jackson.databind.JsonMappingException 没有字符串参数构造函数/工厂方法来从字符串值 ('1' 反序列化)

java - 将文本从原始文件复制到剪贴板

java - 有没有办法知道 ftp shell 脚本失败?

java - 多国数据库表和java对象

java - tomcat 6的问题

java - Api 29 (Android Q) 外部应用程序目录中的 SQLiteOpenHelper

Java BST 最有效地搜索最大值