Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java sort()影响程序中其他方法的性能;为什么?_Java_Performance_Sorting_Bioinformatics - Fatal编程技术网

Java sort()影响程序中其他方法的性能;为什么?

Java sort()影响程序中其他方法的性能;为什么?,java,performance,sorting,bioinformatics,Java,Performance,Sorting,Bioinformatics,我正在开发一个java程序,其中使用了一个类的大量实例。 我必须对数组的每个对象进行一些计算(使用它的类方法)。当我使用Arrays.Sort或其他方法对数组进行排序时,我注意到执行计算的计算时间增加了,这不包括进行排序的时间 如果我对Arrays.sort函数进行注释,则在进行其他计算之前,计算时间约为1或2毫秒,而取消注释则会增加到5或6毫秒 我必须做大量的步骤(甚至300000步),所以增量改变了我很多的表现 对于这种奇怪的行为有什么解释吗?鉴于我对代码知之甚少,这里是我最好的猜测: 对象

我正在开发一个java程序,其中使用了一个类的大量实例。 我必须对数组的每个对象进行一些计算(使用它的类方法)。当我使用Arrays.Sort或其他方法对数组进行排序时,我注意到执行计算的计算时间增加了,这不包括进行排序的时间

如果我对Arrays.sort函数进行注释,则在进行其他计算之前,计算时间约为1或2毫秒,而取消注释则会增加到5或6毫秒

我必须做大量的步骤(甚至300000步),所以增量改变了我很多的表现


对于这种奇怪的行为有什么解释吗?

鉴于我对代码知之甚少,这里是我最好的猜测:

对象通常(尽管不总是)按分配顺序大致放置在堆上。GC将移动它们,但有可能大致保留顺序

然后,当您依次访问每个对象以对其数据进行计算时,最终可能会得到大致线性的内存访问。或者更重要的是,内存访问在某种程度上是可预测的。这使您的CPU缓存和内存子系统更加高效


如果对象未按排序顺序分配,然后对它们进行排序,则会将这种可预测的内存访问变为不可预测的随机访问,这会更慢。

鉴于我对代码所知甚少,下面是我的最佳猜测:

对象通常(尽管不总是)按分配顺序大致放置在堆上。GC将移动它们,但有可能大致保留顺序

然后,当您依次访问每个对象以对其数据进行计算时,最终可能会得到大致线性的内存访问。或者更重要的是,内存访问在某种程度上是可预测的。这使您的CPU缓存和内存子系统更加高效


如果对象未按排序顺序分配,然后对它们进行排序,则会将这种可预测的内存访问变为不可预测的随机访问,这会更慢。

您能告诉我们您到底在做什么吗。实际上,这只是普通数组,访问元素是常量时间


让我们看看下面的场景。让我们看看你未排序的顺序。你在元素“i”处,你在用“for loop”搜索其他元素。如果该元素位于索引“i+1”,则只需花费1步。现在让我们看看排序列表。你要找的同一个元素不是在i+1,而是在其他地方,这会减慢计算速度。我想说,这只是猜测,因为我不知道代码。这完全取决于你在计算中到底在做什么。

你能告诉我们你到底在做什么吗。实际上,这只是普通数组,访问元素是常量时间



让我们看看下面的场景。让我们看看你未排序的顺序。你在元素“i”处,你在用“for loop”搜索其他元素。如果该元素位于索引“i+1”,则只需花费1步。现在让我们看看排序列表。你要找的同一个元素不是在i+1,而是在其他地方,这会减慢计算速度。我想说,这只是猜测,因为我不知道代码。这完全取决于你在计算中到底在做什么。

你是在使用ArrayList吗?所以去掉arrays.sort会让你慢下来,是不是?这可能是因为对有序集合的操作比对无序集合的操作要快(对于您的特定函数)。再说一次,我真的不明白你看到了什么,你的程序打算做什么。对一个大数组进行排序是一项艰巨的工作,而且这项工作需要时间。@KamenStoykov不,我使用的是一个普通数组(一个特定类的对象数组),即Reaction[]r;哦,你是说如果你不先对数组排序,程序运行得更快?听起来它可能与CPU缓存有关。。。这基本上就是Christian在回答中所说的。你在使用ArrayList吗?所以去掉arrays.sort会让你慢下来,是不是?这可能是因为对有序集合的操作比对无序集合的操作要快(对于您的特定函数)。再说一次,我真的不明白你看到了什么,你的程序打算做什么。对一个大数组进行排序是一项艰巨的工作,而且这项工作需要时间。@KamenStoykov不,我使用的是一个普通数组(一个特定类的对象数组),即Reaction[]r;哦,你是说如果你不先对数组排序,程序运行得更快?听起来它可能与CPU缓存有关。。。这基本上就是Christian在回答中所说的。当然,我假设对array.sort的调用在这两种情况下都不是测量时间的一部分。非常感谢,您的回答是合理的。我没有考虑到它们是对象,因此在堆空间中!:)不仅是内存中的线性访问(因此缓存可以有效地工作),还可能是@ChrisVest。如何对对象数组进行排序以保持快速访问?我必须创建新对象并在其上复制旧对象吗?请注意,这种效果甚至可能在将来的程序运行时发生变化。GC可能会在您周围移动对象。经过几次GC循环后,测量的效果可能会发生变化。您使用的是微基准,这是一个错误的度量。如果可能的话,尝试将类的数组更改为链表,因为这样的局部性可能更好。您可能还想阅读有关train算法的内容,以便更好地了解对象是如何移动的。当然,我假设对array.sort的调用在这两种情况下都不是测量时间的一部分。非常感谢,您的回答是合理的。我没有考虑到它们是对象,因此在堆空间中!:)不仅仅是内存中的线性访问