From b221af660d101301606e263cef73b358937516a6 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sun, 28 Aug 2011 22:20:41 -0500 Subject: Database read optimizations Hard to believe there was still more room to improve on this, but I found an easily correctable oversight tonight. Our databases (both sync and local) contain many blank lines, and we were not moving onto the next line right away in these cases; instead we would proceed through our strcmp() conditional checks as normal. Some local numbers follow to show the effects of this patch: Sync `-Ss foobarbaz`: 71,709 blank lines skipped early ~1,505,889 strcmp() calls avoided (21 per line) ~15% speed improvement (.210 --> .179 sec) Local `-Qs foobarbaz`: 6,823 blank lines skipped early 115,991 strcmp() calls avoided (17 per line) ~6% speed improvement (.080 -> .071 sec) Signed-off-by: Dan McGee --- lib/libalpm/be_local.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'lib/libalpm/be_local.c') diff --git a/lib/libalpm/be_local.c b/lib/libalpm/be_local.c index 1a46dfdf..be02bb50 100644 --- a/lib/libalpm/be_local.c +++ b/lib/libalpm/be_local.c @@ -580,7 +580,13 @@ static int local_db_read(alpm_pkg_t *info, alpm_dbinfrq_t inforeq) goto error; } while(!feof(fp)) { - READ_NEXT(); + if(fgets(line, sizeof(line), fp) == NULL && !feof(fp)) { + goto error; + } + if(_alpm_strip_newline(line) == 0) { + /* length of stripped line was zero */ + continue; + } if(strcmp(line, "%NAME%") == 0) { READ_NEXT(); if(strcmp(line, info->name) != 0) { -- cgit v1.2.3-54-g00ecf