У нас есть импортер 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
будет создан непосредственно с соответствующей записью.
Вопросы
Это действительно повышение производительности?
Каковы преимущества / недостатки обеих реализаций?
Какой шаблон я должен использовать для подобных проектов в будущем?