Как chaiscript обрабатывает большие объекты? - PullRequest
0 голосов
/ 27 июня 2018

Я рассматриваю возможность использования 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, после цикла ... (я думаю, ответ - нет.)

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

1 Ответ

0 голосов
/ 04 июля 2018

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

#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.)
...