From a622061b458a8ec0c36a597f8ef2df1d1ac66ea9 Mon Sep 17 00:00:00 2001 From: bol-van Date: Wed, 7 Jan 2026 08:23:45 +0300 Subject: [PATCH] nfqws2: optimize realloc increment --- docs/manual.md | 4 ++-- nfq2/lua.c | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/manual.md b/docs/manual.md index 2cc6c59..a08a066 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -1937,7 +1937,7 @@ function gunzip_inflate(zstream, compressed_data, expected_uncompressed_chunk_si * gunzip_init создает и возвращает контекст gzip потока для последующих вызовов других функций. Значение windowBits см. в документации по zlib (по умолчанию 47). * gunzip_end освобождает контекст gzip. может быть освобожден сборщиком мусора, но лучше вызывать явно. * gunzip_inflate разжимает очередную часть зипованных данных. Данные можно скармливать частями. Расжатые части конкатенируются для получения полных данных. Возвращается 2 аргумента : расжатые данные и bool признак конца gzip. В случае испорченных данных или при нехватке памяти возвращается nil. -* expected_uncompressed_chunk_size - необязательный параметр для оптимизации выделения памяти под расжимаемые данные. Если буфера не хватает, вызываются realloc, копирующие блоки памяти и влияющие на производительность. Размер следует выбирать согласно ожидаемой степени сжатия с небольшим запасом. По умолчанию - четырехкратный размер compressed_data. При нехватке буфера выполняется realloc шагами в 16K. +* expected_uncompressed_chunk_size - необязательный параметр для оптимизации выделения памяти под расжимаемые данные. Если буфера не хватает, вызываются realloc, копирующие блоки памяти и влияющие на производительность. Размер следует выбирать согласно ожидаемой степени сжатия с небольшим запасом. По умолчанию - четырехкратный размер compressed_data. #### gzip @@ -1950,7 +1950,7 @@ function gzip_deflate(zstream, uncompressed_data, expected_compressed_chunk_size * gzip_init создает и возвращает контекст gzip потока для последующих вызовов других функций. Значение windowBits см. в документации по zlib (по умолчанию 31). level - уровень сжатия от 1 до 9 (по умолчанию 9), memlevel - допустимый уровень использования памяти от 1 до 8 (по умолчанию 8). * gzip_end освобождает контекст gzip. может быть освобожден сборщиком мусора, но лучше вызывать явно. * gzip_deflate cжимает очередную часть данных. Данные можно скармливать частями. Cжатые части конкатенируются для получения полных данных. Для финализации потока по окончанию скармливания данных функция должна быть вызвана с uncompressed_data=nil или uncompressed_data="". Возвращается 2 аргумента : сжатые данные и bool признак конца gzip. При ошибках gzip или нехватке памяти возвращается nil. -* expected_compressed_chunk_size - необязательный параметр для оптимизации выделения памяти под cжимаемые данные. Если буфера не хватает, вызываются realloc, копирующие блоки памяти и влияющие на производительность. Размер следует выбирать согласно ожидаемой степени сжатия с небольшим запасом. По умолчанию - половина размера uncompressed_data. При нехватке буфера выполняется realloc шагами в 8K. +* expected_compressed_chunk_size - необязательный параметр для оптимизации выделения памяти под cжимаемые данные. Если буфера не хватает, вызываются realloc, копирующие блоки памяти и влияющие на производительность. Размер следует выбирать согласно ожидаемой степени сжатия с небольшим запасом. По умолчанию - половина размера uncompressed_data. ### Системные функции diff --git a/nfq2/lua.c b/nfq2/lua.c index d540f56..1372ec5 100644 --- a/nfq2/lua.c +++ b/nfq2/lua.c @@ -2686,13 +2686,16 @@ static int luacall_gunzip_inflate(lua_State *L) uzs->zs.next_in = (z_const Bytef*)luaL_checklstring(L,2,&l); uzs->zs.avail_in = (uInt)l; size_t bufchunk = argc>=3 ? luaL_checkinteger(L,3) : l*4; + size_t increment = bufchunk / 2; + if (increment < Z_INFL_BUF_INCREMENT) increment = Z_INFL_BUF_INCREMENT; + do { if ((bufsize - size) < BUFMIN) { if (buf) { - bufsize += Z_INFL_BUF_INCREMENT; + bufsize += increment; newbuf = realloc(buf, bufsize); } else @@ -2797,6 +2800,8 @@ static int luacall_gzip_deflate(lua_State *L) uzs->zs.avail_in = (uInt)l; } size_t bufchunk = BUFMIN + (argc>=3 ? luaL_checkinteger(L,3) : l/2); + size_t increment = bufchunk / 2; + if (increment < Z_DEFL_BUF_INCREMENT) increment = Z_DEFL_BUF_INCREMENT; do { @@ -2804,7 +2809,7 @@ static int luacall_gzip_deflate(lua_State *L) { if (buf) { - bufsize += Z_DEFL_BUF_INCREMENT; + bufsize += increment; newbuf = realloc(buf, bufsize); } else