我正在开发一个 java 程序,其中我使用了大量的类实例。我必须对数组的每个对象进行一些计算(使用它的 Class 方法)。当我使用 Arrays.Sort 或其他方法对数组进行排序时,我注意到执行计算的计算时间增加了,即不包括进行排序的时间!
如果我注释 Arrays.sort 函数,则在其他计算之前,计算时间约为 1 或 2 毫秒,而取消注释它会增加到 5 或 6 毫秒。
我必须为大量步骤(甚至 300,000 步)做这项工作,所以增量改变了我的表现。
这种奇怪的行为有什么解释吗?
我正在开发一个 java 程序,其中我使用了大量的类实例。我必须对数组的每个对象进行一些计算(使用它的 Class 方法)。当我使用 Arrays.Sort 或其他方法对数组进行排序时,我注意到执行计算的计算时间增加了,即不包括进行排序的时间!
如果我注释 Arrays.sort 函数,则在其他计算之前,计算时间约为 1 或 2 毫秒,而取消注释它会增加到 5 或 6 毫秒。
我必须为大量步骤(甚至 300,000 步)做这项工作,所以增量改变了我的表现。
这种奇怪的行为有什么解释吗?
鉴于我对代码知之甚少,这是我最好的猜测:
对象通常(尽管并非总是)按照它们被分配的大致顺序放置在堆上。GC 会移动它们,但有可能会大致保留顺序。
然后,当您轮流访问每个数据以对其数据进行计算时,您最终可能会得到大致线性的内存访问。或者更重要的是,可以预测的内存访问。这使您的 CPU 缓存和内存子系统更加高效。
如果对象未按排序顺序分配,然后对它们进行排序,则将这种可预测的内存访问转变为不可预测的随机访问,这会更慢。
你能告诉我们你到底在做什么。实际上,这只是普通数组,访问元素是 CONST 时间。
让我们看看下面的场景。让我们看看您未排序的订单。您在元素“i”处,您正在使用“for loop”搜索其他元素。如果此元素位于索引“i+1”处,则只需 1 步。现在让我们看一下排序列表。您正在寻找的相同元素不会在 i+1 处,而是在其他地方,这会减慢计算速度。我想说这只是GUESS,因为我不知道代码。这完全取决于你在计算中到底在做什么。