c++ - ChaiScript 如何处理大对象?

标签 c++ performance ram large-data chaiscript

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

我有一个使用大型数据结构(至少 1-2GB)的模拟。因此,我担心我会通过在 chaiscript 中做这样的事情来破坏我的 RAM:

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. chaiscript 会在每次循环执行之间删除数据吗?即new_data...
  2. chaiscript 会在退出循环后删除数据吗?再次 new_data...
  3. 如果对 1. 和 2. 的回答是肯定的,我是否需要检查其他方法以保证安全?
  4. chaiscript 会删除未使用的变量吗?即data,循环后...(我猜答案是否定的。)

感谢您的帮助!

最佳答案

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

#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 不会删除同一 block 内未使用的数据。 ( new_data 在循环后被删除,但 data 没有。)

关于c++ - ChaiScript 如何处理大对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51066031/

相关文章:

javascript - 在 JavaScript 中将数字转换为字符串的最佳方法是什么?

performance - 雪碧包 : Efficiently create many SpriteNodes

cpu - RAM提取16位或128位所需的时间相同吗?

c++ - C++11 的 std::thread 与 POSIX 信号量兼容吗?

performance - 部署在 Azure 上的服务速度极慢

c++ - 如何使用C++在Clion中创建数据库?

arrays - Fortran:普通数组与存储相同数据量的对象所需的 RAM

java - java在开发中通常会占用所有这些内存吗?

c++ - 在具有自定义属性的图中获取/查找顶点的安全方法 -> 良好的编程习惯?

c# - 指向 native C++ 堆的指针上的 Marshal.PtrToStructure 是否正常?