JMeter’s percentile timers are actually calculating something much simpler than you might think, and it’s not directly about average performance at all.
Let’s see what this looks like in practice. Imagine we’re hitting an API endpoint 100 times, and JMeter records these response times:
10ms, 12ms, 15ms, 18ms, 20ms, 22ms, 25ms, 28ms, 30ms, 32ms,
35ms, 38ms, 40ms, 42ms, 45ms, 48ms, 50ms, 52ms, 55ms, 58ms,
60ms, 62ms, 65ms, 68ms, 70ms, 72ms, 75ms, 78ms, 80ms, 82ms,
85ms, 88ms, 90ms, 92ms, 95ms, 98ms, 100ms, 102ms, 105ms, 108ms,
110ms, 112ms, 115ms, 118ms, 120ms, 122ms, 125ms, 128ms, 130ms, 132ms,
135ms, 138ms, 140ms, 142ms, 145ms, 148ms, 150ms, 152ms, 155ms, 158ms,
160ms, 162ms, 165ms, 168ms, 170ms, 172ms, 175ms, 178ms, 180ms, 182ms,
185ms, 188ms, 190ms, 192ms, 195ms, 198ms, 200ms, 202ms, 205ms, 208ms,
210ms, 212ms, 215ms, 218ms, 220ms, 222ms, 225ms, 228ms, 230ms, 232ms,
235ms, 238ms, 240ms, 242ms, 245ms, 248ms, 250ms, 252ms, 255ms, 258ms
The average response time here is roughly 136.5ms (sum of all times / 100). But what about percentiles?
To find the P95 (95th percentile), we sort these times from smallest to largest and find the value that separates the bottom 95% from the top 5%. With 100 samples, the 95th percentile corresponds to the 95th value in the sorted list. Looking at our sample data, the 95th value is 245ms. This means 95% of your requests finished in 245ms or less.
The P99 (99th percentile) is the value that separates the bottom 99% from the top 1%. In our list of 100, this is the 99th value: 255ms. So, 99% of your requests finished in 255ms or less.
You can configure these percentiles directly in JMeter’s "Summary Report" or "Aggregate Report" listeners. Under "Advanced Settings," you’ll find a "Percentiles (comma-separated list)" field. For P95 and P99, you’d enter 90,95,99. JMeter will then calculate and display these values for you.
The true power of percentiles, especially P95 and P99, is that they ignore outliers. An extremely slow request (an outlier) can drastically skew the average response time, making it look much worse than it is for the vast majority of users. Percentiles, on the other hand, give you a much more realistic picture of the typical user experience. They tell you, "Even for the slowest 5% (or 1%) of requests, performance was still this good."
This is critical for understanding user satisfaction. Users don’t care about the average if they happen to be one of the unlucky few experiencing a very slow response. P95 and P99 help you identify and address those less-than-ideal experiences without being overly sensitive to a single, anomalous slow request.
It’s important to understand that JMeter’s percentile calculation uses an approximation method by default. For very large test runs, calculating exact percentiles can be computationally expensive. JMeter uses a technique to estimate these values efficiently, which is usually perfectly acceptable for performance testing. If you need absolute precision for specific analyses, you might consider exporting the raw JTL results and processing them with external tools that offer exact percentile calculations, but for most use cases, JMeter’s built-in approximation is sufficient.
The next step is to understand how to interpret these percentile values in the context of your application’s Service Level Objectives (SLOs).