Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.bin/make make: improve performance for LazyBuf
details: https://anonhg.NetBSD.org/src/rev/17aa0d5c26cb
branches: trunk
changeset: 982371:17aa0d5c26cb
user: rillig <rillig%NetBSD.org@localhost>
date: Sun Apr 11 22:53:45 2021 +0000
description:
make: improve performance for LazyBuf
The previous O(n^2) time complexity for parsing a long string with many
variable expressions was not meant to last for long. I had hoped to fix
it within a few minutes, but that will take more time.
For now, make LazyBuf simpler by using a traditional C string for the
expected part instead of a Substring. This avoids a strlen call per
Var_Parse.
No functional change, only performance.
diffstat:
usr.bin/make/str.h | 14 ++++++--------
usr.bin/make/var.c | 8 ++++----
2 files changed, 10 insertions(+), 12 deletions(-)
diffs (91 lines):
diff -r bb2b381ce221 -r 17aa0d5c26cb usr.bin/make/str.h
--- a/usr.bin/make/str.h Sun Apr 11 21:29:57 2021 +0000
+++ b/usr.bin/make/str.h Sun Apr 11 22:53:45 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: str.h,v 1.4 2021/04/11 20:38:43 rillig Exp $ */
+/* $NetBSD: str.h,v 1.5 2021/04/11 22:53:45 rillig Exp $ */
/*
Copyright (c) 2021 Roland Illig <rillig%NetBSD.org@localhost>
@@ -59,7 +59,7 @@
char *data;
size_t len;
size_t cap;
- Substring expected;
+ const char *expected;
void *freeIt;
} LazyBuf;
@@ -231,7 +231,7 @@
MAKE_INLINE void
-LazyBuf_Init(LazyBuf *buf, Substring expected)
+LazyBuf_Init(LazyBuf *buf, const char *expected)
{
buf->data = NULL;
buf->len = 0;
@@ -257,15 +257,14 @@
}
buf->data[buf->len++] = ch;
- } else if (buf->len < Substring_Length(buf->expected) &&
- ch == buf->expected.start[buf->len]) {
+ } else if (ch == buf->expected[buf->len]) {
buf->len++;
return;
} else {
buf->cap = buf->len + 16;
buf->data = bmake_malloc(buf->cap);
- memcpy(buf->data, buf->expected.start, buf->len);
+ memcpy(buf->data, buf->expected, buf->len);
buf->data[buf->len++] = ch;
}
}
@@ -297,8 +296,7 @@
MAKE_INLINE Substring
LazyBuf_Get(const LazyBuf *buf)
{
- const char *start = buf->data != NULL
- ? buf->data : buf->expected.start;
+ const char *start = buf->data != NULL ? buf->data : buf->expected;
return Substring_Init(start, start + buf->len);
}
diff -r bb2b381ce221 -r 17aa0d5c26cb usr.bin/make/var.c
--- a/usr.bin/make/var.c Sun Apr 11 21:29:57 2021 +0000
+++ b/usr.bin/make/var.c Sun Apr 11 22:53:45 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: var.c,v 1.922 2021/04/11 21:29:57 rillig Exp $ */
+/* $NetBSD: var.c,v 1.923 2021/04/11 22:53:45 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -140,7 +140,7 @@
#include "metachar.h"
/* "@(#)var.c 8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.922 2021/04/11 21:29:57 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.923 2021/04/11 22:53:45 rillig Exp $");
/*
* Variables are defined using one of the VAR=value assignments. Their
@@ -2233,7 +2233,7 @@
const char *p;
p = *pp;
- LazyBuf_Init(part, Substring_InitStr(p)); /* TODO: O(n^2) */
+ LazyBuf_Init(part, p);
/*
* Skim through until the matching delimiter is found; pick up
@@ -4136,7 +4136,7 @@
const char *p = *pp;
int depth = 0; /* Track depth so we can spot parse errors. */
- LazyBuf_Init(buf, Substring_InitStr(p));
+ LazyBuf_Init(buf, p);
while (*p != '\0') {
if ((*p == endc || *p == ':') && depth == 0)
Home |
Main Index |
Thread Index |
Old Index