From the creation of the field of Membrane Computing in 1998, several research lines have been opened. On the one hand, theoretical questions like the computational power and the computational efficiency of P systems have been studied. In this sense, several techniques to demonstrate the ability of these systems to provide solutions to computational problems have been explored. The study of efficient (polynomial-time) solutions to presumably hard problems for finding thin frontiers of efficiency is a very active area. On the other hand, several applications in biology, ecology, economy, robotics and fault diagnosis, among others, have been investigated. Real systems with some characteristics seem to be easy to model with membrane systems due to their behaviour. In this work, a survey of the theoretical part will be given, explaining techniques both in the field of computability theory and in the field of computational complexity theory.