"Per Abrahamsen" <abraham@dina.kvl.dk> wrote
[8<8<8<]
> Jeg har en masse linier i stil med
>
> log.output ("foo", a + b);
>
> der tillader brugeren at "logge" state i en simulation jeg kører.
>
> Min profilering viser vare at hvis folk vil logge mange ting bliver
> systemet domineret af strcmp. Så i stedet for "foo" vil jeg gerne
> kunne bruge en int.
Jeg går ud fra at der til "foo" er associeret en eller anden form for
information, og det er derfor at der laves en masse "strcmp".
Kunne det være en idé at bruge en hashing fuktion inde i kaldet til
"log.output", så den associerede information kan findes hurtigere ?
Eventuelt kunne man bruge en klasse som "hash_map" fra STLPort til at knytte
tekststrengen og den associerede information sammen.
> En løsning kan være
>
> static const int foo_id = name2id ("foo");
> log.output (foo_id, a + b);
>
> hvor name2id er en funktion der tildeler hver unik streng et unikt
> nummer. Men jeg harikke lyst til at hav en ekstra linie for hver ting
> der kan logges, så i stedet har jeg lavet en makro
>
> #define output_value(log, key, value)\
> do { \
> static const int MACRO_id = name2id (key); \
> (log).output (MACRO_id, (value)); \
> } while (false)
>
> output_value (log, "foo", a + b);
>
> Det giver en anseelig speedup, men jeg ville gerne slipper for at
> bruge makroer, så jeg leder efter ideer til et alternativ.
Den vil også kun virke hvis det er samme tekst, der bruges hver gang på et
givent sted - det ved jeg selvfølgelig ikke om det er en rimelig
begrænsning.
>
> En template ville være ideel
>
> template<const char *const name>
> void output_value (Log& log, double value)
> {
> static const int id = name2id (name);
> log.output (id, value);
> }
>
> output_value<"log"> (log, a + b);
>
> men C++ tillader ikke "literal strings" som template argumnter.
Nej.
Er der nogen grund til at det skal være en string literal ?
Kunne man tillade sig at skrive noget i retningen af:
class foo
{
public:
// maybe:
static const char* text = "foo text";
};
class bar
{
public:
// maybe
static const char* text = "bar text";
}
log.output<foo>(a+b);
log.output<bar>(c+d);
?
[8<8<8<]
> nogle eneklete
> "ids" der først kendes på run-time, og viden om identifier (log
> variable)
Ok, det udelukker vel nogenlunde brugen af typer som foreslået ovenfor.
[8<8<8<]
> Er der en bedre løsning en makroen?
Forhåbentlig
Venlig hilsen
Mogens Hansen