Minimize the features in the requirements.
Specify performance boundaries and goals.
Consider the numbers, sizes, and sources of objects, data, and other
parameters of the application.
Create an abstract model of the application to identify any
performance problems.
Design applets to engage the user as soon as possible.
Identify and focus on the performance costs of shared resources.
Target decoupling, indirection, abstraction, and extra layers in the
design.
Predict the performance of design elements that block, copy, queue,
or distribute.
Consider alternative designs that bypass or reduce high-performance
costs.
Avoid transactions where possible.
Minimize transaction time where transactions are necessary.
Lock only where the design absolutely requires it.
Design parallelism into the application wherever possible. Identify
what cannot be parallelized.
Watch out for too much parallelism.
There are diminishing returns from parallelism overhead.
Balance workloads. Unbalanced parallel activities may limit the
performance of the system.
Split up the data among many different files (preferably on separate
disks).
Support asynchronous communications.
Decouple activities so that no activity is unnecessarily blocked by
another activity.
Minimize points where parallel activities are forced to converge.
Design for redundant servers and automatic switching capabilities.
Consider using batch processing.
Design more flexible method entry points to your classes to provide
greater performance flexibility when developing reusable code.