groff
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Groff] caching result of charinfo::get_flags


From: Werner LEMBERG
Subject: Re: [Groff] caching result of charinfo::get_flags
Date: Mon, 20 Dec 2010 06:14:43 +0100 (CET)

> if there are a lot of character classes, the frequently used
> function `charinfo::get_flags' can get expensive.  Any idea how to
> cache its return value?  Essentially, it needs to be computed only
> once, but as soon as `.class' is called again, it has to be
> recomputed (again, only once)...
> 
> Perhaps calling `.class' should simply trigger recomputation of all
> charinfos in the dictionary?

After some thinking, I believe we need something like that anyway:
Consider for example, this:

  .class [foo] abc
  .cflags 1 \C'[foo]'
  .class [foo] abcd

The result will probably suprise you: `d' now also has cflags value 1!
If groff has to access the cflags value of a character, it does two
things:

  1. Get the current character's cflags value (if any).
  2. Check all classes whether the current character is part of a
     class.  If yes, use the cflags value of that class (and do an OR
     operation with the already retrieved cflags value if necessary).

I'll now implement caching like this:

  1. If `.class' is called, set a global flag `class_flag' to true.
  2. If there is any access to cflags values, recompute them for all
     entries in the `charinfo_dictionary' and set `class_flag' to
     false.

BTW, profiling shows indeed that calling `get_flags' uses far too much
time.


    Werner



reply via email to

[Prev in Thread] Current Thread [Next in Thread]