Registrazione dei nomi di funzioni su sistemi con poche risorse (di memoria e di spazio)

1

Il nostro modulo di registrazione ha un buffer che spesso si riempie e stiamo cercando una soluzione per accorciare i nostri registri, senza fare alcuna complicazione delle prestazioni.

Il codice è scritto in C ++ e attualmente stiamo usando __FUNCTION__ per estrarre il nome della funzione per una traccia, ma su ambienti Windows aggiunge anche l'intero spazio dei nomi, che spesso rappresenta più della metà della traccia.

Una delle soluzioni proposte era di analizzare la stringa restituita da "__FUNCTION__" ed estrarre solo il nome della funzione, ma preferiremmo non compromettere le prestazioni in termini di tempo.

Un'altra soluzione proposta era di # definire un nome di funzione breve all'inizio di ogni metodo e #undefinirlo alla fine.

C'è qualche altro approccio per accorciare (il nome del file in) registra su sistemi che hanno poche risorse?

    
posta Ioanna 18.02.2015 - 09:47
fonte

2 risposte

1

Potresti usare __LINE__ invece, e anche se i nomi delle funzioni non saranno più presenti nei tuoi registri, puoi facilmente risolverli durante l'analisi dei log.

Un'alternativa è un oggetto statico in ogni funzione, dichiarata all'inizio, che avvolge le funzioni del logger in modo da utilizzarlo per scrivere le righe del registro. Il costruttore memorizzerebbe un codice (ad esempio il numero di riga della dichiarazione) che verrebbe registrato al posto del nome della funzione successivamente.

    
risposta data 18.02.2015 - 10:00
fonte
3

Mantieni una mappa in cui accumuli nomi di funzioni e associali a ID interi univoci.

Dovresti essere in grado di ottimizzare le prestazioni della mappa prendendo in considerazione il fatto che il nome della funzione prodotto dal compilatore per una determinata funzione avrà sempre lo stesso indirizzo. (Ci sarà una sola costante di stringa per nome di funzione nel segmento di dati.) Esattamente quello che fai potrebbe essere l'argomento di un'altra domanda di StackOverflow, ma non è nemmeno necessario.

Quindi, la prima volta che si incontra un nome di funzione, si genera un ID univoco per esso (incrementando un contatore) e si genera una voce di registro che documenta il fatto che questo ID da quel momento in poi si riferirà all'intero nome di funzione (spazio dei nomi e tutto).

Quindi, da quel momento in poi, ogni volta che incontri quel nome di funzione, emetti invece solo l'ID intero.

Potresti anche voler scrivere un'utilità da eseguire sul tuo computer desktop che legge tale registro e lo decodifica sostituendo questi ID con i nomi delle funzioni effettive.

    
risposta data 18.02.2015 - 10:01
fonte

Leggi altre domande sui tag