2012-02-14 56 views
3

我做的應用程序。它搜索具有特殊擴展名的文件。我使用多線程:在每個目錄(小任務)創建一個線程,這使得這樣的工作:有多少線程最好使用? (java)

/** 
* Explore given directory. 
* @param dir - directory to explore. 
* @return snapshot of directory - FilesAndDirs object, 
* which encapsulates information about directory. 
*/ 
public final FilesAndDirs exploreDirectory(final File dir) { 
    final List<File> subDirectories = new ArrayList<File>(); 
    final List<File> files = new ArrayList<File>(); 
    if (dir.isDirectory()) { 
     final File[] children = dir.listFiles(); 
     if (children != null) { 
      for (File child : children) { 
       if (child.isFile() && !child.isHidden() 
         && checkExtension(child)) { 
        files.add(child); 
       } else { 
       if (child.isDirectory() && !child.isHidden()) { 
         subDirectories.add(child); 
        } 
       } 
      } 
     } 
    } 
    return new FilesAndDirs(files, subDirectories); 
} 

這種方法使定目錄的快照,並returs像FilesAndDirs對象,holdes列表文件和結果列出subDirs。在另一個方法(getFiles())中,我有List文件 - 具有給定擴展名的文件 - 是搜索結果和第二個List目錄 - 它包含探索方法的每個目錄的子目錄。
因此,每個線程探索目錄,給定的擴展名的文件,他放在結果列表中,他放在子目錄列表中的給定目錄的子目錄,然後將它添加到getFiles()方法的目錄列表中。我使用固定線程池,但問題是我應該使用多少個線程來獲得更好的性能? 我讀過,如果任務不是IO密集型的,我應該使數量等於可用核心數量 Runtime.getRuntime()。availableProcessors()。 現在探索C:和D:目錄的時間是41秒。但也許我應該使用更多的線程或使用一些「魔術」類import java.util.concurrent。 這裏是getFiles()方法:getFiles() method

+3

但您的任務大量使用I/O。所以你可以增加線程數量到可用處理器/內核的數量,但是我甚至不確定這是高性能的,因爲你花在CPU上的時間很少,而在I/O上花費很多時間。當你增加對I/O的訪問時,你創建一個小的開銷,因爲需要訂購更多的請求(因爲它是在一個帶有SSD的智能手機上,所以沒有頭移動的問題) – 2012-02-14 20:20:36

+1

你需要對它進行基準測試找出不同的設備。即使有很多CPU核心,I/O限制的東西也可能在大多數設備上產生相似的結果。 – David 2012-02-14 20:26:05

回答

4

從硬盤驅動器讀取是連續的,所以此處的多線程效率不高。您的方法受到硬盤驅動器上I/O操作的限制。不在你的CPU上。

相關問題