Which is more efficient? duplifaces, particles, or group instances?
I do not know the specifics of Blender's implementation. But, it seems to me, they would use the exact same algorithm in both cases. With particle instancing, you have a position vector and a transformation matrix for each particle. The only difference with dupliface is the position vector is determined by an object's face, rather than a particle.

So, memory is going to be the same. Render time should be the same, unless you're using extra features. For example, you can have objects deform along a particle's path when using particle instancing. The deformations would take extra time to compute when rendering.