在保持良好的面向对象设计的同时,重用代码以获得性能的最佳方法是什么?

时间:2015-06-23 10:28:20

标签: c++ performance optimization

我正在开发一个有几个耗时的科学计划 从不同的其他函数调用的函数。我想优化 这些调用避免使用相同的参数调用相同的函数 曾经没有破坏封装等OO概念。

我试图制定一个基本的例子。 A类的对象是 B类,我从中计算A类函数所需的中间结果。 例如,为了使functionA和functionB计算其结果, 每个函数都需要从B调用对象的time_consuming_function。 通常这个函数是从循环内调用的,所以参数(1和2) 在对functionA和functionB的调用中是相同的。

class ClassA {
  ClassB obj // member object

  return_type functionA(parameter1, parameter2) {
    value1 = obj.time_consuming_function(parameter1)
    value2 = obj.time_consuming_function(parameter2)

    return some_operation_with(value1, value2)
  }

  return_type functionB(parameter1, parameter2) {
    value1 = obj.time_consuming_function(parameter1)
    value2 = obj.time_consuming_function(parameter2)

    return some_operation_with(value1, value2)
  }
}

一种解决方案是创建一个结构来保存计算值 调用ClassA函数,例如:

class ClassA {
  ClassB obj // member object

  return_type functionA(data) { // data is a structure to hold the values
    if (data.is_empty()) {
      data.value1 = obj.time_consuming_function(parameter1)
      data.value2 = obj.time_consuming_function(parameter2)
    }

    return some_operation_with(data.value1, data.value2)
  }

  return_type functionB(data) { // same data obj as before

    // this time data is not empty, so no calculation needed
    if (data.is_empty()) {
      data.value1 = obj.time_consuming_function(parameter1)
      data.value2 = obj.time_consuming_function(parameter2)
    }

    return some_operation_with(data.value1, data.value2)
  }
}

另一个解决方案是创建一个类Data来预先保存数据。 在这种情况下,拥有参数1和2,我会更新所有属性 在类Data上使用此参数进行更改以及从中执行函数时 A类我只需要使用之前计算的值。班级 A将提供Data类的接口。

class Data {
  ClassA class_a_obj

  void update_values_that_depend_on_parameter1(class_a_obj, parameter1) {
    value1 = class_a_obj.time_consuming_function(parameter1)
  }

  void update_values_that_depend_on_parameter2(parameter2) {
    value2 = class_a_obj.time_consuming_function(parameter2)
  }
}

class ClassA {
  ClassB obj // member object

  return_type functionA(data) {
    return some_operation_with(data.value1, data.value2)
  }

  return_type functionB(data) { // same data obj as before

    return some_operation_with(data.value1, data.value2)
  }

  return_type time_consuming_function(parameter) {
    return obj.time_consuming_function(parameter)
  }
}

我想知道您对此问题的看法以及建议的解决方案。 还有其他合适而有效的解决方案吗?

TL; DR:

我有一个程序可以进行多次计算和每次计算 调用函数来获取中间值。这些值是相同的 从接收相同参数的函数调用,我正在寻找一种方法 优化这些调用重用这些中间值。

在保持良好对象的同时重用这些值的最佳方法是什么 面向设计??

1 个答案:

答案 0 :(得分:3)

通过代理缓存对这些方法/对象的访问,缓存最近的结果并返回缓存的结果。