2012-06-14 18 views
0

我想讀同一時間文件並返回行讀2文件在同一時間,沒有更多的表現

ExecutorService executor = Executors.newFixedThreadPool(2); 
FutureTask<Integer> futureOne = new FutureTask<Integer>(new Calcul1()); 
FutureTask<Integer> futureTwo = new FutureTask<Integer>(new Calcul2()); 
executor.execute(futureOne); 
executor.execute(futureTwo); 
while (!(futureOne.isDone() && futureTwo.isDone())) { 

} 

System.out.println(futureOne.get() + futureTwo.get()); 
executor.shutdown(); 

能很好的數字,但我發現的是更快,如果我讀文件1和後文件2 ...所以我沒有得到任何性能提升與futureTash

爲什麼?

+0

你有一個旋轉循環測試完成?這種外觀做什麼?你說「讀取文件1」,但你的意思是「調用'新的Calcul1()。run()'」? – Gray

+0

雅,閱讀文件1 = Calcul1,閱讀fil2 = Calcul2,沒有線程,採取2次要......與futureTask我得到4.5秒 –

回答

2

我懷疑你的應用程序是完全IO綁定的。當您在一個線程中閱讀單個文件時,您會看到更好的性能,因爲您正在按順序訪問您的文件。當你啓動兩個線程時,你從兩個不同的文件中讀取數據,這實際上導致磁盤在兩個文件之間來回尋找。如果我們正在談論旋轉磁盤類型的磁盤,尋道時間是IO的重要部分。

5

旋轉環完全浪費一個內核 - 這就是線程間信號的作用。如果你只有一個磁盤有兩個文件,那麼根本不會有太多的加速,並且在行動中它可能是負面的。如果你在不同的磁盤上有文件(尤其是具有高延遲連接的網絡磁盤),那麼性能會有很大的提升。

+0

值得注意的是,這是因爲操作系統緩衝文件的方式。 – Griwes

相關問題