Парсеры (в контексте компьютерных технологий) — это программы или алгоритмы, способные преобразовать определенный массив данных в некую структурированную информацию. При обмене данными между устройствами (к примеру, при отправке этой статьи на ваше устройство) парсеры используются для преобразования полученных данных в то, что устройство может обработать.
Учитывая это, легко понять важность подобных алгоритмов, а также значение их эффективности для общей производительности системы. Одним из способов оптимизации таких программ является использование технологии, называемой zero-copy (нулевое копирование).
Парсер с нулевым копированием представляет собой участок кода, который может преобразовывать полученные данные в структурированную форму, не копируя при этом содержимое в новые буферы.
Это отличает данный вид парсеров от прочих, используемых для преобразования части данных в набор значений (например, строки и массивы): программы без нулевого копирования выделяют новую область в куче и копируют в нее соответствующую часть полученных данных.
В качестве примера простейшего парсера с нулевым копированием я создал программу на языке C, которая выполняет парсинг массива байтов в заранее определенный struct. Программа предполагает, что полученные данные будут содержать заголовочный байт, за которым следует строка.
s
truct ParsedData {
uint8_t header;
char *payload;
};
void parse_buffer(uint8_t *buffer, struct ParsedData *parsed_data) {
parsed_data->header = buffer[0];
parsed_data->payload = (char *)&buffer[1];
};
Код достаточно прост: в struct перемещается значение примитива (header — заголовок) и указатель на массив символов (payload — полезная нагрузка). Заметим, что хотя некоторые могут назвать эту процедуру копированием, она не выделяет новую память, а лишь выполняет простые инструкции перемещения значений и указателей:
Читать