[poppler] Why does Gfx::opTab need to be built at runtime?

Krzysztof Kowalczyk kkowalczyk at gmail.com
Wed Sep 26 11:43:35 PDT 2007


On 9/26/07, Albert Astals Cid <aacid at kde.org> wrote:
> A Dimarts 25 Setembre 2007, Krzysztof Kowalczyk va escriure:
> > I'm looking at optimizing poppler in  various ways and just noticed
> > something I don't understand. I hope someone will be able to enlighten
> > me.
> >
> > In Gfx.h there is:
> >
> > struct Operator {
> >   char name[4];
> >   int numArgs;
> >   TchkType tchk[maxArgs];
> >   void (Gfx::*func)(Object args[], int numArgs);
> > };
> >
> > and in Gfx.cc a table is filled out like this:
> >
> > Operator Gfx::opTab[] = {
> >   {"\"",  3, {tchkNum,    tchkNum,    tchkString},
> >           &Gfx::opMoveSetShowText},
> >
> > According to a profiler, at least on Windows, the single biggest
> > function in poppler (~9k) is anonymous function constructed by the
> > compiler to fill out Gfx::opTab.
>
> What do you exactly mean with ~9k ?

It means that behind the scenes a compiler generates a function that
is 9k of assembly code (that is in optimized msvc build) and all it
does is constructing this table at runtime, even though I would hope
all this data is known statically and could be simply stored in data
section.

Changing char name[4] to char* name saves 1k of code.

Adding const doesn't change anything.

Ultimately I would like to find a way to force compiler to fully build
it at compile time.

I haven't looked at what gcc produces but it should be apparent after
looking at map file of inspecting symbol table.

-- kjk


More information about the poppler mailing list