Я рассматриваю возможность использования chaiscript для моего проекта. Тем не менее, у меня есть вопрос о производительности. Может быть, где-то уже был дан ответ, но я не смог его найти …
У меня есть симуляция с использованием больших структур данных (не менее 1-2 ГБ). Поэтому, я боюсь, что я унесу свою оперативную память, делая что-то вроде этого в chaiscript:
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
после цикла … (я думаю, что ответ — нет.)Спасибо за помощь!
После многих испытаний я нашел ответ на свои вопросы с помощью следующего кода:
#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 и посмотрел статистику времени выполнения, чтобы выяснить, что произошло в оперативной памяти: Статистика выполнения
Код работает разумно. После фазы запуска 1 ГБ ОЗУ выделяется для data
объект. В цикле оперативная память остается на 2 ГБ, потому что у нас также есть new_data
объект. После цикла он падает до 1 ГБ.
Поэтому ответы на мои вопросы таковы:
update_structure(int i, std::vector<int> data)
, затем функция будет использовать копию данных, и, следовательно, объем оперативной памяти перейдет к 3 ГБ в цикле.new_data
удаляется после цикла, но не data
.)Других решений пока нет …