Un array di char (più precisamente unsigned char, ma lo è di default) è equivalente ad un array di byte ed è più veloce di una string, ma introduce molte più complicazioni che possono intrudurre bug e far si che il codice, se mal strutturato, risulti più lento di uno con un più alto livello di astrazioni.
A parte che sarebbe più logico l'uso di vector che di string, o comunque di altre strutture...
String è per l'elaborazione di stringhe di testo...

In sostanza: in assoluto un array di char è più veloce ma in realtà la scelta va valutata più cautamente.

Altra possibile soluzione è la parallelizzazione, come ti è stato suggerito, la quale però introduce altre complicazioni.

Dipende dai casi, comunque a mio parere la scelta più corretta sarebbe implementare classi con un'alto livello di astrazione e codice ottimizzato all'interno (in modo che, una volta implementato e testato per bene il codice interno, l'uso risulti facile e sicuro) in abbinamento a una buona parallelizzazione (es: elaborazione indipendente di più righe o sezioni dell'immagine)