It's an interesting question, because the advice changes over time. Having said that:
- On a GPU, by far the most efficient way, as Nathan Reed said in the comment, is to use the rasterisation hardware because that is that it is designed for.
- On a CPU, one of the most efficient ways is to more-or-less mimic what rasterisation hardware does.
GPU vendors are understandably quiet about the specifics of their hardware design, but the basic idea hasn't changed for a few decades.
- Conceptually split the screen into tiles, e.g. of 8 by 8 pixels.
- Traverse the tiles which overlap with a triangle using some variant on Pineda's method.
- For each tile, compute a bit mask to find the exact pixels (or samples, if you're subsampling) in the bucket which are inside the triangle, using half-plane calculations. In GPU speak, the samples in a tile which are inside the triangle are called a fragment.
- Do whatever processing is needed on the fragment.
On a modern CPU, fragment processing (including the half-space calculations) can be made extremely efficient by using vector instructions.