chaiscript 如何处理大对象?
Posted
技术标签:
【中文标题】chaiscript 如何处理大对象?【英文标题】:How does chaiscript handle big objects? 【发布时间】:2018-12-06 12:59:26 【问题描述】:我正在考虑在我的项目中使用 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
我的问题是:
-
chaiscript 会在每次循环执行之间删除数据吗?即
new_data
...
chaiscript 会在退出循环后删除数据吗?再次new_data
...
如果 1. 和 2. 的答案是肯定的,我是否需要另一种方法来检查以确保安全?
chaiscript 会删除未使用的变量吗?即data
,循环后...(我猜答案是否定的。)
感谢您的帮助!
【问题讨论】:
【参考方案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。
因此,我的问题的答案是:
-
chaiscript 确实会在每次循环 for 语句后删除数据。
chaiscript 在循环之后也会删除数据。
是的,您需要检查 c++ 函数不会创建不必要的数据。例如,如果您使用副本而不是引用写入 --
update_structure(int i, std::vector<int> data)
,则该函数将使用数据副本,因此 RAM 将在循环中跳转到 3GB。
chaiscript 不会删除同一块内未使用的数据。 (new_data
在循环后被删除,但不是data
。)
【讨论】:
作为 ChaiScript 的作者,我会评论说,是的,所有对象在离开当前范围后都会被删除。我认为这使 ChaiScript 成为极少数可以依赖对象生命周期并具有可预测的析构函数调用的脚本语言之一。所以在你的“数据”对象的情况下,它实际上是一个全局的,生活在***范围内,它没有办法被破坏。您可以像使用 C++ 一样将其放在显式的
范围内。
感谢您的澄清!我玩了一段时间,想为我的程序添加脚本支持,但我不知道该怎么做。我偶然发现了 chaiscript,但很高兴看到它如此轻松地解决了我的问题 :D以上是关于chaiscript 如何处理大对象?的主要内容,如果未能解决你的问题,请参考以下文章