From 1504e26e38d5e9a3257f2308e50174a398a27f35 Mon Sep 17 00:00:00 2001 From: apocelipes Date: Wed, 6 Dec 2023 19:06:44 +0900 Subject: [PATCH] optimize(Packages): optimize reading large files Using less syscalls and processing data in memory makes getNumStringsImpl ~300% faster. The code is much simpler. --- src/detection/packages/packages_linux.c | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/detection/packages/packages_linux.c b/src/detection/packages/packages_linux.c index 9351b420f..ef5d1162d 100644 --- a/src/detection/packages/packages_linux.c +++ b/src/detection/packages/packages_linux.c @@ -42,26 +42,19 @@ static uint32_t getNumElements(FFstrbuf* baseDir, const char* dirname, unsigned static uint32_t getNumStringsImpl(const char* filename, const char* needle) { - FILE* file = fopen(filename, "r"); - if(file == NULL) + FF_STRBUF_AUTO_DESTROY content = ffStrbufCreate(); + if (!ffReadFileBuffer(filename, &content)) return 0; uint32_t count = 0; - - char* line = NULL; - size_t len = 0; - - while(getline(&line, &len, file) != EOF) + char *iter = content.chars; + size_t needleLength = strlen(needle); + while ((iter = memmem(iter, content.length - (size_t)(iter - content.chars), needle, needleLength)) != NULL) { - if(strstr(line, needle) != NULL) - ++count; + ++count; + iter += needleLength; } - if(line != NULL) - free(line); - - fclose(file); - return count; }