Which is faster between static and dynamic getSObjects?

Functionally, there is no difference. These two options return the same data. These functions are mostly the same.

From a performance perspective, the static approach is approximately 2.5x faster. I ran 25 trials each of 1,000 calls, and the static approach averaged 20.48 ms (20.48 µs per call), whereas the dynamic approach averaged 51.40 ms (51.40 µs per call).

Approach    Min CPU/iteration (µs)    Max CPU/iteration (µs)    Avg CPU/iteration (µs)
Static                       15.00                     32.00                     20.48
Dynamic                      40.00                     66.00                     51.40

I was bothered by null pointer exception when i was experimenting with my code. I changed static access method to getSObjects method and found a strange thing which could be important, when we use getSObjects method and related list is empty then returns null, opposite to static method which always returns a empty list. It happend to me when I was trying to access related list of object inside for loop

for(Account acc : accounts){
acc.getSObjects('AccountContactRoles'); // returns null
acc.AccountContactRoles;                // returns empty list
}