我正在考虑将 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
我的问题是:
new_data
... new_data
... data
,在循环之后...(我想答案是否定的。)感谢您的帮助!
答案 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。
因此,我的问题的答案是:
update_structure(int i, std::vector<int> data)
进行编写,则该函数将使用数据副本,因此RAM将在循环中跳至3GB。new_data
会在循环后删除,但不会删除data
。)