Software engineering has traditionally focussed on functional requirements and how to build software that has few bugs and can be easily maintained. Most design approaches include non-functional requirements among the elements of the analysis of a system, but little attention has usually been paid to how these requirements can be dealt with through the development life-cycle. Performance analysis, mostly through queueing models and simulations, has usually been used only in designing hardware devices, such as switches, or in capacity planning in the deployment of systems, again concentrating on the hardware and its ability to cope with a given workload. Work on the inclusion of performance engineering throughout the life-cycle has made relatively little impact. With the advent of more structured software design approaches, such as component based development, software architectures and object broker distributed systems, the ability to design software for performance has begun to emerg...