我得到了一个逗号分隔的文件,其中包含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