Создание нового экземпляра в каждом вызове функции имеет только одного члена класса - PullRequest
0 голосов
/ 30 августа 2018

У нас есть импортер C ++, который импортирует большой объем xml-данных в базу данных. Обычно количество записей в xml составляет от 500 000 до 2 000 000.

Импортер был реорганизован из следующего кода в новый код:

Legacy Code

class DataHandler
{
   public:

    handleStartTag()
    {
         _value.clear();
    }

    handleAttribute(const std::string& attribute)
    {
        _attribute = attribute;
    }

    handleValue(const std::string& value)
    {
        _value += value;
    }

    handleEndTag()
    {
        _record.set(_attribute, _value);

        RecordProcessor rp(_record);
        // rp.setSomeProperties
        rp.run();
    }

   private:

    std::string _attribute;
    std::string _value;

    Record _record;
};

Новый код

class DataHandler
{
   public:

    handleStartTag()
    {
         _value.clear();
    }

    handleAttribute(const std::string& attribute)
    {
        _attribute = attribute;
    }

    handleValue(const std::string& value)
    {
        _value += value;
    }

    handleEndTag()
    {
        _record.set(_attribute, _value);

        _processor.setSomeProperties();
        _processor.run(record);

        _processor.clear();
    }

   private:

    std::string _attribute;
    std::string _value;

    Record _record;
    RecordProcessor _processor;
};

Основное отличие состоит в том, что мы не создаем новый экземпляр RecordProcessor в каждом вызове handleEndTag(). Это было реализовано, потому что (говорят) для 2 миллионов записей требуется много времени для создания / уничтожения экземпляра RecordProcessor.

Мое личное мнение таково, что унаследованный код - лучший шаблон для реализации этой функциональности. RecordProcessor будет создан непосредственно с соответствующей записью.

Вопросы

Это действительно повышение производительности?

Каковы преимущества / недостатки обеих реализаций?

Какой шаблон я должен использовать для подобных проектов в будущем?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...