All computer applications boil down to the process of transferring and processing data. As applications become more complex, more and more steps are added to that process. With each new step, there is a new point at which data could potentially be bottlenecked. A bottleneck occurs at a process or component in an application that has the lowest throughput, therefore limiting the overall performance of an application. Identifying and correcting bottlenecks is crucial to maintaining a well performing application but it's not always an easy thing to do. When evaluating an application for performance you should always account for the possibility of a bottleneck. Here are 4 common points where an application will experience a performance bottleneck.
90% of the time you will find that poor performance comes from a data access bottleneck. Spend some extra time to make sure your data storage is configured properly to handle the load required for the rest of the application. Database indices and query optimization can go a long way.
Some data processing can be very CPU intensive and in turn backs up the entire flow of data in your application. If your CPU is maxed, you should look at options to delay or offload some of the work that the application is doing.
KISS (keep it simple stupid) is the take away here, overly complex or custom UI Components can have a huge hit on performance for the user. Fancy graphics and cool features can be good selling points but can also turn off a lot of potential users if they aren't tuned to work on a wide range of systems. Add an option for a more slimmed down interface that doesn't drain the user's system resources to appeal to more users.
Internet speeds have made huge gains in recent years but this is still something you should be aware of. Data transfer can still bottleneck your performance if you are sending large chunks at a time. Consider sending data only as it's needed to increase the end-to-end performance as perceived by the user.