Re: reducing the footprint of ScanKeyword (was Re: Large writable variables)
John Naylor <jcnaylor@gmail.com>
From: John Naylor <jcnaylor@gmail.com>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Andres Freund <andres@anarazel.de>, pgsql-hackers@postgresql.org
Date: 2018-12-21T23:38:48Z
Lists: pgsql-hackers
Attachments
- v2-wip-use-offset-based-scankeywords.patch (text/x-patch) patch v2
On 12/20/18, Tom Lane <tgl@sss.pgh.pa.us> wrote: > I'd be inclined to put the script in src/tools, I think. IMO src/common > is for code that actually gets built into our executables. Done. >> which takes >> pl_unreserved_kwlist.h as input and outputs >> pl_unreserved_kwlist_offset.h and pl_unreserved_kwlist_string.h. > > I wonder whether we'd not be better off producing just one output > file, in which we have the offsets emitted as PG_KEYWORD macros > and then the giant string emitted as a macro definition, ie > something like > > #define PG_KEYWORD_STRING \ > "absolute\0" \ > "alias\0" \ > ... > > That simplifies the Makefile-hacking, at least, and it possibly gives > callers more flexibility about what they actually want to do with the > string. Okay, I tried that. Since the script is turning one header into another, I borrowed the "*_d.h" nomenclature from the catalogs. Using a single file required some #ifdef hacks in the output file. Maybe there's a cleaner way to do this, but I don't know what it is. Using a single file also gave me another idea: Take value and category out of ScanKeyword, and replace them with an index into another array containing those, which will only be accessed in the event of a hit. That would shrink ScanKeyword to 4 bytes (offset, index), further increasing locality of reference. Might not be worth it, but I can try it after moving on to the core scanner. > I'm for "not change things unnecessarily". People might well be > scraping the keyword list out of parser/kwlist.h for other purposes > right now --- indeed, it's defined the way it is exactly to let > people do that. I don't see a good reason to force them to redo > whatever tooling they have that depends on that. So let's build > kwlist_offsets.h alongside that, but not change kwlist.h itself. Done. >> I used the global .gitignore, but maybe that's an abuse of it. > > Yeah, I'd say it is. Moved. >> +# TODO: Error out if the keyword names are not in ASCII order. > > +many for including such a check. Done. > Also note that we don't require people to have Perl installed when > building from a tarball. Therefore, these derived headers must get > built during "make distprep" and removed by maintainer-clean but > not distclean. I think this also has some implications for VPATH > builds, but as long as you follow the pattern used for other > derived header files (e.g. fmgroids.h), you should be fine. Done. I also blindly added support for MSVC. -John Naylor
Commits
-
Use perfect hashing, instead of binary search, for keyword lookup.
- c64d0cd5ce24 12.0 landed
-
Reduce the size of the fmgr_builtin_oid_index[] array.
- 8ff5f824dca7 12.0 landed
-
Replace the data structure used for keyword lookup.
- afb0d0712f1a 12.0 landed