我得到了一個逗號分隔的文件,其中包含10 977 120個隨機數(60 MB),其中我得到了總和。這項任務是關於同時進行這項工作,並因此儘可能禁食。長話短說,我將文本文件加載到一個字符串數組中。我的下一個想法是,然後將這個數組分成四個小塊,然後對於每個塊,有一個線程來總結這個塊。與copyOfRange分割數組時出現奇怪的運行時間
奇怪的是,當我將列表分成4個部分時,我的運行時間差別很大。
我有看起來像這樣的方法:
public void splitNumbers(String[] numbers){
int size = numbers.length;
String[][] numberssplit = new String[4][];
numberssplit[0] = Arrays.copyOfRange(numbers, 0, size/4);
numberssplit[1] = Arrays.copyOfRange(numbers, (size/4)+1, size/2);
numberssplit[2] = Arrays.copyOfRange(numbers, (size/2)+1, 3*(size/4));
numberssplit[3] = Arrays.copyOfRange(numbers, (3*(size/4))+1, size-1);
//MS: 2750
}
以上大約需要2750毫秒
numberssplit[0] = Arrays.copyOfRange(numbers, 0, size/4);
numberssplit[1] = Arrays.copyOfRange(numbers, (size/4)+1, size/2);
//numberssplit[2] = Arrays.copyOfRange(numbers, (size/2)+1, 3*(size/4));
//numberssplit[3] = Arrays.copyOfRange(numbers, (3*(size/4))+1, size-1);
MS: 5
然而,只有拆分兩個部分,採用5個MS,使它看起來就像是最後兩件需要更長的時間。
只有分裂第三部分以2毫秒
//numberssplit[0] = Arrays.copyOfRange(numbers, 0, size/4);
//numberssplit[1] = Arrays.copyOfRange(numbers, (size/4)+1, size/2);
numberssplit[2] = Arrays.copyOfRange(numbers, (size/2)+1, 3*(size/4));
//numberssplit[3] = Arrays.copyOfRange(numbers, (3*(size/4))+1, size-1);
//MS: 2
也是如此。第四部分時,它的唯一的一塊被拆分。
//numberssplit[0] = Arrays.copyOfRange(numbers, 0, size/4);
//numberssplit[1] = Arrays.copyOfRange(numbers, (size/4)+1, size/2);
//numberssplit[2] = Arrays.copyOfRange(numbers, (size/2)+1, 3*(size/4));
numberssplit[3] = Arrays.copyOfRange(numbers, (3*(size/4))+1, size-1);
//MS: 2
最後,最後兩個未加註釋,需要2927毫秒
//numberssplit[0] = Arrays.copyOfRange(numbers, 0, size/4);
//numberssplit[1] = Arrays.copyOfRange(numbers, (size/4)+1, size/2);
numberssplit[2] = Arrays.copyOfRange(numbers, (size/2)+1, 3*(size/4));
numberssplit[3] = Arrays.copyOfRange(numbers, (3*(size/4))+1, size-1);
//MS: 2927
看來當numbersplit[2]
和numbersplit[3]
是結合它需要大量的再像,但是這是爲什麼?顯然,java在幕後做了一些魔術,但我無法看到邏輯。那麼發生了什麼?
60MB文件中有多少個String對象?基本上,你的數字數組有多長?多少內存分配給你的jvm? –
10 977 120個號碼^^,我不確定 – Jazerix