Even for pin groups the overhead of combining pin access often is slower and takes more code.
Here are some examples (C++ statement followed by generated code):
To write one bit for ports A-G sbi/cbi is the winner:
PORTB |= 0X1;
c: 28 9a sbi 0x05, 0 ; 5
With two or more pins, combining bits requires more instructions. You also need a cli/sei to make it atomic for general use.
cli();
c: f8 94 cli
PORTB |= 0X11;
e: 85 b1 in r24, 0x05 ; 5
10: 81 61 ori r24, 0x11 ; 17
12: 85 b9 out 0x05, r24 ; 5
sei();
14: 78 94 sei
So it is hard to save time or code by combining bits. You do get all bits changing state at the same time.
The best plan for a pinGroup is to dedicate an entire port so you don't need to OR or AND bits and worry about atomic operations. That's why I think a DigitalPort class is best.
For Mega ports H, J, and K cbi/sbi can't be used since the port address is too large. Setting a single bit in these port is slow:
cli();
c: f8 94 cli
PORTH |= 0X1;
e: e2 e0 ldi r30, 0x02 ; 2
10: f1 e0 ldi r31, 0x01 ; 1
12: 80 81 ld r24, Z
14: 81 60 ori r24, 0x01 ; 1
16: 80 83 st Z, r24
sei();
18: 78 94 sei