Avatar billede hurra Novice
05. marts 2009 - 11:02 Der er 6 kommentarer og
1 løsning

compiletime string->id

Hej experter, jeg sidder lige med et program jeg har overtaget fra nogle andre. I programmet er der voldsom meget kommunikation med andre programmer, måleinstrumenter og andet extern hardware.

Alt dette kommunikation skal logges. Lige nu blive det, sammen med traces, bare skrevet som text stringe ud i en fil.

Der bliver skrevet op til 80Mb data hver gang programmer bliver kørt (på ca 5 minuter).

Af flere årsager er det nu blevet nødvendig at optimere denne logning, men der må ikke blive skåret ned i informationen der bliver logget.

Min tanke er at i stedet for at logge en hel string, vil jeg, i precompileren, kikke koden igennem for stringe der bliver brugt til loggen, lave en enum med id'er for alle stringene, og en text fil, som så skal være 'nøglen' til at læse loggen. Der skal så også laves et lille logviewer program, der kan sammen sætte en log fil og en nøgle.

Mit program kunne e.g. se sådan her ud:
// auto genereret enum
typedef enum
{
  logidResultat_f,
  logidStatus_d
} TLogId;

// macro til at oversætte fra string til id
#define STR_ID(x) (TLogId)x

// log funktionen der skal skrive noget binær data i en fil
void Log(TLogId id, ...)
{
}

void main()
{
  for(unsigned char i=0; i<10; ++i)
    Log(STR_ID("Resultat: %f"), 1.23);
  Log(STR_ID("Status: %d"), 0);
}

Mit problem er nu min macro til at oversætte fra string til id. Kan det lade sig gøre på en eller anden sinrig vis? Det skal naturligvis foregå compiletime. Eller hvor kan jeg gøre det her jeg gerne vil?
Avatar billede hurra Novice
05. marts 2009 - 11:21 #1
Glemte forresten at skrive, at hoved formålet med denne optimering ikke så meget er at spare plads i loggen, det er bare en positiv side effekt.

Det vigtigste er at der skal gå hurtigere at logge data.
Avatar billede bertelbrander Novice
05. marts 2009 - 19:35 #2
Man kan ikke lave en macro der laver en string om til en enumerator/id/tal, det er ikke noget problem at gå den modsatte vej.

Du kunne lave et lille program/script der går din source kode igennem og udskifter alle strengene med en ID.
Avatar billede hurra Novice
06. marts 2009 - 09:26 #3
Det var lidt det jeg regnede med, men håbede på noget andet :)

Jeg har nu lavet et script der kikker hele koden igennem, og lave alle labels om til const string, og laver en enum. Der skulle ikke være meget i at lade det script skifte alle stringene ud med id nummeret.

Der er bare et problem i det. Der er rigtigt mange filer i projektet, og alt er checket ind i clearcase, og dermed har man kun skrive rettigheder til det andet end de filer man har checket ud. Man kunne selvføldig også vende bøtten en smule, og sige at vi i fremtiden checker kode ind hvor id'erne bliver brugt i stedet for stringene.

Jeg ved ikke rigtigt... er det en god ide? Jeg synts umidlbart at koden hvor stringene er i er mere over skuelig.

Et andet alternativ kunne så være at buildscriptet tager en lokal kopi af alt koden, retter den til, og bygger... Det syntes jeg heller ikke er helt optimalt.

Det sidste alternativ må vel så være at søge for at linkeren ikke for nogle string med fra objekt filerne. Men det vil så kræve at jeg piller i objekt filerne, lige inden linker skal overtage dem. Kan man det?
Avatar billede bertelbrander Novice
08. marts 2009 - 01:19 #4
Jeg ville skifte strengene ud med id'er én gang for alle.
Det er noget bøvl at gøre det hver gang du skal bygge, og du risikerer at der kommer fejl.

Hvis du virkelig vil kan du naturligvis godt ændre i objekt filerne, men det er viste for urealistisk meget arbejde.
Avatar billede segmose Nybegynder
10. marts 2009 - 13:58 #5
Grib fat i log rutinen, hvis du kan skelne teksterne fra data der kan du bygge en liste af tekster on the fly. Kom dem i et array/liste/hash og giv dem et nummer eller benyt deres index.
Når loggen lukkes skriv listen med tekster til sidst med deres index.
Du vil så have en log fil der måske ser sådan ud

1 - 5435
2 - 324
1 - 33545
1 - 3434
---
1: Det var ikke så godt.
2: Måske er det noget bæ.
Avatar billede hurra Novice
13. marts 2009 - 11:41 #6
segmose: Det minder lidt om den løsning jeg har nu ('nu' er i et test program). Hvor jeg beregner et id ud fra en hash lignende methode. Det er ikek helt optimalt....

Hvis alt skal være helt vildt effektivt, er det nok (som forvendtet) kun bertelbranders methode der virker rigtigt godt.

Det jeg vil gå i gang med at implementere er et script der bliver kaldt i precompileren, og som lave en emun liste af alle log stringe (der er tagged med STR_ID()). Der ud over bliver alle log stringen også udskiftet i koden, så altså det kode der bliver checked in, er uden log stringe, men med id'er.

bertelbrander: Kommer du ikke lige med et svar?
Avatar billede hurra Novice
14. april 2009 - 21:02 #7
I mellem tiden er jeg selv kommet i tanke om et tæt på genialt svar, syntes jeg da selv :)

Jeg har lavet en function til at logge, den tager filnavn og line nummer som input, men IKKE noget med texten der skal logges, kun det eliptiske input.

Jeg har så en macro jeg bruger der hvor jeg skal logge data. Den kalder ovennævnte funktion med filnavn, linie nummer, osv.

Når så loggen skal parses, er det bare at kikke tilbage i koden, for at finde ud af hvordan log dataen skal bruges (det er naturligvis scripted).
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester