脚本如何处理大物体?

时间:2018-06-27 15:01:47

标签: c++ performance ram large-data chaiscript

我正在考虑将 chaiscript 用于我的项目。但是,我对性能有疑问。也许它已经在某个地方被回答了,但我找不到它...

我使用大型数据结构(至少1-2GB)进行了模拟。因此,我担心我会通过在脚本中执行以下操作来消耗内存:

var data = create_big_structure();
for (var i = 1; i < max; ++i)
{
   var new_data = update_structure(i, data);
   output_data_evolution(data, new_data);
   data = new_data;
}
//data is not needed anymore

我的问题是:

  1. 脚本会在每次循环执行之间删除数据吗?即new_data ...
  2. 退出循环后,脚本会删除数据吗?再次new_data ...
  3. 如果对1.和2.的回答为是,是否还有另一种方法需要检查以确保安全?
  4. 脚本会删除未使用的变量吗?就是data,在循环之后...(我想答案是否定的。)

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

经过大量测试,我找到了使用以下代码的问题的答案:

#include <vector>
#include <chaiscript/chaiscript.hpp>

std::vector<int> create_big_structure() {
  //This is 1GB in size.
  return std::vector<int>(268435456);
}
std::vector<int> update_structure(int i, const std::vector<int>& data) {
  //This is 1GB in size.
  return std::vector<int>(268435456);
}
void output_data_evolution(const std::vector<int>& data, const std::vector<int>& new_data) {}

int main() {
  chaiscript::ChaiScript chai;

  chai.add(chaiscript::fun(&create_big_structure), "create_big_structure");
  chai.add(chaiscript::fun(&update_structure), "update_structure");
  chai.add(chaiscript::fun(&output_data_evolution), "output_data_evolution");
  chai.add(chaiscript::bootstrap::standard_library::vector_type<std::vector<int>>("VectorInt"));
  chai.eval(R"(
    var max = 5;
    var data = create_big_structure();
    for (var i = 1; i < max; ++i)
    {
      var new_data = update_structure(i, data);
      output_data_evolution(data, new_data);
      data = new_data;
    }
  )");
}

我使用MSVC运行代码,并查看运行时统计信息以找出RAM中发生了什么:Runtime Statistics

该代码运行合理。在启动阶段之后,为data对象分配了1GB的RAM。在循环中,RAM保持为2GB,因为我们还有new_data对象。循环后,它降到了1GB。

因此,我的问题的答案是:

  1. chaiscript 确实确实在每次for语句循环之后删除数据。
  2. chaiscript 也会在循环后删除数据。
  3. 是的,您需要检查c ++函数不会创建不必要的数据。例如,如果您使用副本而不是引用update_structure(int i, std::vector<int> data)进行编写,则该函数将使用数据副本,因此RAM将在循环中跳至3GB。
  4. chaiscript 不会删除同一块中未使用的数据。 ({new_data会在循环后删除,但不会删除data。)