05. marts 2009 - 11:02Der 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, ...) { }
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?
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?
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æ.
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.
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).
Synes godt om
Ny brugerNybegynder
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.