Как chaiscript обрабатывает большие объекты?

Я рассматриваю возможность использования 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

Мои вопросы:

  1. Будет chaiscript удалить данные между каждым выполнением цикла? а именно new_data
  2. Будет chaiscript удалить данные после выхода из цикла? Снова new_data
  3. Если ответ на 1. и 2. да, есть ли другой способ, который мне нужно проверить, чтобы все еще быть в безопасности?
  4. Будет chaiscript удалить неиспользуемые переменные? а именно dataпосле цикла … (я думаю, что ответ — нет.)

Спасибо за помощь!

0

Решение

После многих испытаний я нашел ответ на свои вопросы с помощью следующего кода:

#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 ГБ.

Поэтому ответы на мои вопросы таковы:

  1. chaiscript действительно удаляет данные после каждого цикла оператора for.
  2. chaiscript удаляет данные и после циклов.
  3. Да, вам нужно убедиться, что функции c ++ не создают ненужных данных. Например, если вы пишете с копией вместо ссылки — update_structure(int i, std::vector<int> data), затем функция будет использовать копию данных, и, следовательно, объем оперативной памяти перейдет к 3 ГБ в цикле.
  4. chaiscript не удаляет неиспользуемые данные внутри одного блока. (new_data удаляется после цикла, но не data.)
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector