Instead of letting the CPU read the values in a tight loop, some microcontrollers can use the DMA + Timer to automatically read a GPIO register into a memory buffer at accurately timed intervals. After reading a few hundred samples, the CPU can process the information in a burst, which should be more efficient than processing 1 bit/interrupt.
I've used this method in a recent project for 8 soft UART receivers, with little CPU overhead.