如何有效地使用深层复制?

时间:2018-06-08 13:11:12

标签: java performance deep-copy

我正在编写一个类GenerateNeighbours,其中将初始解Sol传递给构造函数。要计算该解决方案的许多“邻居”。为了确保我的初始解决方案不会改变,我每次迭代都会对初始解决方案进行深度复制。

此外,我正在使用使用S_Comp创建的arraylist generateSComp()。在每次迭代开始时,将使用此版本的S_Comp。因此,我没有在每次迭代时调用generateSComp(),因为我认为这是不必要的,并且需要过多的时间。

由于S_Comp在每次迭代中都发生了变化,并且我想确保每次迭代都以相同的S_Comp开始,因此我也使用深层副本。但是,我觉得我的方法效率不高,因为我的程序的运行时间在每次迭代时调用generateSComp几乎没有改进。

下面你可以找到我正在谈论的代码:

public GenerateNeighbours(DataFile testDataFile, ArrayList<Route> Sol, Random randomGen) throws IOException
    {       
        solution = (ArrayList<Route>) DeepCopy.copy(Sol);
        S_Comp = new ArrayList<MyNodesData>();
        S_Comp = generateSComp(testDataFile, solution, S_Comp);
        ArrayList<MyNodesData> originalS_Comp = (ArrayList<MyNodesData>) DeepCopy.copy(S_Comp);

        rewards = new ArrayList<Integer>(); 
        neighbours = new ArrayList<ArrayList<Route>>();

        //---------Generating neighborhood solutions---------
        for(int i=0; i<parameterSet.getBeta(); i++)         
        {
            solution = (ArrayList<Route>) DeepCopy.copy(Sol);      <---- making a deep copy every iteration     
            S_Comp = (ArrayList<MyNodesData>) DeepCopy.copy(originalS_Comp);    <---- making a deep copy every iteration
//          S_Comp = new ArrayList<MyNodesData>();          
//          generateSComp(testDataFile, solution, S_Comp);      <------- This is what should be unnecessary since S_Comp is the same at the start of every iteration 
            step1to6(i);
            rewards.add(getSolutionReward(solution));
            neighbours.add(solution);
        }
    }

由于我每次迭代都会制作两份深拷贝,所以我觉得我的程序效率很低。有没有人建议如何更有效地使用我的深层拷贝?或者这只是它应该做的方式?

(对于DeepCopy课程,我使用了http://javatechniques.com/blog/faster-deep-copies-of-java-objects/

中建议的课程

0 个答案:

没有答案