Odwołanie się do elementu przez kropkę jest szybsze bo to po prostu - jeśli element jest na stosie - odwołanie do znanej w momencie kompilacji lokacji w pamięci.
Przez wskaźnik (referencję) jest gorzej, bo mamy dwa kroki - 1) pobierz wartość wskaźnika (referencji) ze znanego podczas kompilacji miejsca pamięci do rejestru i 2) pobierz wartość wskazywaną przez rejestr do docelowego miejsca/rejestru.
Z drugiej strony, przekazywanie wskaźnika (referencji) jest szybsze od przekazywania struktury z tego prostego powodu że wskaźnik zawsze zajmuje 4 bajty (w 32 bitowym programie) a struktura niekoniecznie... Ogólna zasada mogłaby brzmieć - jeśli przekazujesz coś większego od 8 bajtów zastanów się nad przekazaniem przez referencję.
Z trzeciej strony, ja bym się zupełnie tym nie przejmował i zostawił to kompilatorowi.
Weź na przykład pod uwagę że kod
my_struc *a = foo();
b = a->sb;
c = a->sc;
zostanie rozwinięty prawdopodobnie w
my_struc *a = foo();
my_struc av = *a;
b = av.sb;
c = av.sc;
oczywiście przy użyciu rejestrów procesora a nie zmiennych na stosie.