ChaiScript 如何处理大对象?
How does chaiscript handle big objects?
我正在考虑为我的项目使用 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
,在循环之后...(我猜答案是否定的。)
感谢您的帮助!
经过大量测试,我用以下代码找到了问题的答案:
#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。但是,我对性能有疑问。也许它已经在某个地方得到了回答,但我找不到它...
我有一个使用大型数据结构(至少 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
,在循环之后...(我猜答案是否定的。)
感谢您的帮助!
经过大量测试,我用以下代码找到了问题的答案:
#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
没有。)