# How to Fix Performance Problems

* Performance of a system can easily be improved, with a little planning and experience/skills
  * But there is a asymptotic aspect of improving performance, you eventually get less bang (small % increase in performance metric) to the time spend doing so
  * Thus avoid major spending too much time optimising, unless it is required (SLA)
* Under time-to-market pressure, it is both wise and effective to choose a solution that gets the job done simply and quickly, but less efficiently than some other solution
  * performance is a part of usability, and often it must eventually be considered more carefully.
* Be aware when optimising, locally it might be slower on your machines compared to production
  * The benchmarks used or how they are collated might not be accurate
  * The compiler might do it's own optimisations after several repetitions
  * Just measuring, will influence the performance too

## How

* Need to analyse the system
  * Need metrics
  * Need evidence
  * Need to be able to replay this area of optimisation, to test your fix works
* Need to find the bottlenecks
  * places where most of the resources are consumed
  * No need to focus on optimising anything if it counts for a small % of computation time.
  * Focus on the big rocks first, the easy wins
* To do this, you will need tools, llike a profiler or other apps
  * logs will also help too
* Focus on things that will improve the system at least 2x for that metric
  * Or some big factor
* Any change that is made, will require testing, which needs to be factored in
  * Is the change to hard to test (or measure)?
* Well designed systems, especially if modular will contain the performance issue in the module (segratated section) and can just focus on that
  * May allow you to redesign that module instead, as better allocatio of time
* Might be the case, that all the easy wins do not help attian your performance goal
  * This can lead to doing the hard and time consuming stuff
  * It might be better to redesign system in this case
    * Less time to improve system and/or much better performance improvements

## Examples

* Using a database connection pool, instead of connecting to database everytime per call
* Using indexes in databases for common column looks up
* Using caching for non changing data (or hardly changing data)
* unnecessary I/O in inner loops
* leaving in debugging statements that are no longer needed
* Too many logs
* unnecessary memory allocation
* inexpert use of libraries


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://hanfak.gitbook.io/workspace/testing-reading-maintaining/fixing/performance-problems.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
