Nuova libreria 74HC595 per controllo display LCD ed uscite digitali

Dopo un duro lavoro di ottimizzazioni eccomi qui con la nuova implementazione della mia libreria. Come detto nei precedenti post ho lavorato, grazie ai vostri consigli, sull'ottimizzazione della velocità e devo dire la verità che con l'uso dei display la differenza è notevole. C'è però una scelta da fare che volevo discutere con tutti voi. Ho infatti lavorato su due versioni distinte, non perchè sia impazzito, ma perchè ad un certo punto del lavoro ho notato che introducendo ulteriori ottimizzazioni del codice cpp, la velocità complessiva della sketch diminuiva invece che aumentare. Ho perciò pensato che fosse un problema dovuto all'incapacità del compilatore ad ottimizzare correttamente il codice cpp per cui ho scitto anche una versione in C che come presunto si è dimostrata più veloce. Ma non basta. Oltre ad usare i due linguaggi, ho usato sia codice ottimizzato all'interno della libreria, sia mi sono appoggiato ad una nuova microlibreria scritta apposta per l'occasione. Questa seconda opzione ha ovviamente il vantaggio di essere utilizzabile in qualsiasi altra vostra sketch o libreria. In entrambi i casi NON ho gestito in modo diretto le porte ma ho sfruttato le funzioni di basso livello di Arduino digitalPinToBitMask e portOutputRegister che sicuramente non permettono di raggiungere le massime velocità possibili ma dovrebbero garantire totale compatibilità con qualunque clone Arduino.
Vi riporto qui sotto le due sketch d'esempio, la prima in cpp, la seconda in c. La libreia Memoryfree che vedete mi serve solo a calcolare la memoria residua della Uno per ottimizzare anche quell'aspetto

// versione scritta in Cpp

#include <FastArduino.h>
#include <hc595.h>
#include <MemoryFree.h>

unsigned char Leds;
unsigned long time1,time2;

hc595 My595(12,11,13,2); // latch,clock,data,number of 74hc595


void setup() 
{
 Leds=0;
  My595.DisplayReset(LCD595_BASIC_DISPLAY_INIT | LCD595_MORELINES ,0); // multiline display
 My595.SetCursor(0,0,1,0); // cursor at 0,0, display type 1 on first 595
 My595.DisplayWrite("Setup is OK...",0); // Write string
 delay(1500); // waiting for...
 My595.DisplayClean(0); // clear display
Serial.begin(9600); 
}

void loop()
{
    time1 = micros();
  My595.SetCursor(Leds%13,Leds%2,1,0);
  My595.DisplayChar(32+Leds%96,0);
   time2 = micros();

  Serial.println(time2-time1);
   Serial.print("freeMemory()=");
  Serial.println(freeMemory());
  Leds++;
  delay(500);
}
// versione scritta in C
#include <FastArduino.h>
#include <hc595c.h>
#include <MemoryFree.h>

unsigned char Leds;
unsigned long time1,time2;

void setup() 
{
 hc595_hc595(12,11,13,2); // latch,clock,data,number of 74hc595
 Leds=0;
 hc595_DisplayReset(LCD595_BASIC_DISPLAY_INIT | LCD595_MORELINES ,0); // multiline display
 hc595_SetCursor(0,0,1,0); // cursor at 0,0, display type 1 on first 595
 hc595_DisplayWrite("Setup is OK...",0); // Write string
 delay(1500); // waiting for...
 hc595_DisplayClean(0); // clear display
 Serial.begin(9600);

 
}

void loop()
{
    time1 = micros();
  hc595_SetCursor(Leds%13,Leds%2,1,0);
  hc595_DisplayChar(32+Leds%96,0);
   time2 = micros();

  Serial.println(time2-time1);
   Serial.print("freeMemory()=");
  Serial.println(freeMemory());
  Leds++;
  delay(500);
}

I risultati che ho ottenuto sono i seguenti:
Con codice ottimizzato all'interno della libreria hc595:
C -len: 5178- speed: 4864- ram: 1763 (aggiornato dopo aver postato)
CPP - len: 5474 - speed: 5180- ram: 1761

e con libreria esterna FastArduino:
C - len: 5378 - speed: 4908- ram: 1763
CPP - len: 5670 - speed: 4932- ram: 1761

Con len si intende la lunghezza della sketch, speed i microsecondi medi per l'esecuzione e ram la memoria disponibile. L'utilizzo della ram risulta sostanzialmente uguale nelle varie "incarnazioni". Per quanto riguarda la grandezza della sketck in entrambi i casi la scrittura in C fa risparmiare circa 290 bytes ed altri 200 vengono risparmiati passando dall'uso della libreria esterna al codice bulti-in. L'estremo massimo si ha dalla scrittura in cpp con libreria esterna, al codice C builtin con risparmio di 480 bytes.
Anche la velocità di esecuzione porta ad alcune riflessioni. La versione in C è sempre la più veloce ed il codice built-in ottimizzato è di quasi l'1% più veloce rispetto alla libreria esterna. Usando il cpp invece si ha lo strano fenomeno che vi descrivevo all'inizio, ossia l'uso della libreria esterna MENO ottimizzata è paradossalmente più veloce di quasi il 5% nonostante il maggior numero di chiamate a funzioni e calcoli da eseguire. L'unica spiegazione che ho è appunto la scarsa capacità del compilatore ad ottimizzare il codice cpp rispetto il codice c puro, infatti se guardiamo la sola versione con codice built-in in cui il codice è fortemente più ottimizzato, vediamo che il divario fra la versione c e cpp è nettamente più marcato passando da meno dello 0.5% a quasi il 6%.
Dopo questa lunghissima ma necessaria introduzione la domanda è: che libreia terreste? Qualla in C con codice builtin o quella cpp con libreria esterna? Rispetto alla sketch d'esempio, la prima è dell'1% più veloce, fa risparmiare 480bytes in flash e 2 in ram, la seconda è leggermente più lenta, occupa più spazio in sketch ma essendo in cpp è più semplice da gestire / mantenere e si basa su una libreiria esterna su cui possiamo basare anche altre sketch che necessitino di un aumento prestazionale senza rischiare di pregiudicare la compatibilità con altre schede.
Voi cosa scegliereste?