# Migrating from Developing Asynchronous Multi-Threading Programs to Reactive Programs in Java
## 7 Evaluation of Results
### Performance Analysis
#### 7.2.2 Evaluation Under Concurrent Load Conditions
In this setup, both a list of user IDs that will subscribe and a list of user IDs to be subscribed to were added to the JMeter test plan, with multiple unique application user identities used across different virtual users. This approach evaluated the performance impact of multiple virtual users executing subscription operations simultaneously. The plots displaying the memory and throughput variation are presented in Figure 6.  
At a low concurrency level of 10 users, the reactive model consumed 87 MB of memory, while the asynchronous model consumed 94 MB. CPU usage was 8.6% for the reactive model and 10.2% for the asynchronous model. The average response time was 7 ms for the reactive model and 8 ms for the asynchronous model. The 90 th percentile response time was 10 ms for both models. Throughput was measured at 1060 req/s for the reactive model and 992 req/s for the asynchronous model. At a mid-concurrency level of 250 users, the reactive model consumed 213 MB of memory, while the asynchronous model consumed 239 MB. CPU usage was 31.3% for the reactive model and 30.8% for the asynchronous model. The average response time was 41 ms for the reactive model and 62 ms for the asynchronous model. The 90 th percentile response time was 50 ms for the reactive model and 129 ms for the asynchronous model. Throughput was measured at 4998 req/s for the reactive model and 3335 req/s for the asynchronous model. At a peak concurrency level of 1000 users, the reactive model consumed 366 MB of memory, while the asynchronous model consumed 394 MB. CPU usage was 37.9% for the reactive model and 35.6% for the asynchronous model. The average response time was 153 ms for the reactive model and 245 ms for the asynchronous model. The 90 th percentile response time was 191 ms for the reactive model and 291 ms for the asynchronous model. Figure 6: Performance results for users subscribing. Throughput was measured at 5446 req/s for the reactive model and 3704 req/s for the asynchronous model. The third scenario under consideration involves updating an existing message. This test was conducted using distinct instances for both users and messages to evaluate performance during update operations. The memory and throughput variations are plotted in Figure 7.  
At a low concurrency level of 10 users, the reactive model consumed 81 MB of memory, while the asynchronous model consumed 93 MB. CPU usage was 7.9% for the reactive model and 9.5% for the asynchronous model. The average response time was 8 ms for the reactive model and 9 ms for the asynchronous model. The 90 th percentile response time was 10 ms for the reactive model and 11 ms for the asynchronous model. Throughput was measured at 981 req/s for the reactive model and 955 req/s for the asynchronous model. At a mid-concurrency level of 250 users, the reactive model consumed 206 MB of memory, while the asynchronous model consumed 229 MB. CPU usage was 24.2% for the reactive model and 23.4% for the asynchronous model. The average response time was 71 ms for the reactive model and 73 ms for the asynchronous model. The 90 th percentile response time was 105 ms for the reactive model and 162 ms for the asynchronous model. Throughput was measured at 3081 req/s for the reactive model and 2624 req/s for the asynchronous model. At a peak concurrency level of 1000 users, the reactive model consumed 303 MB of memory, while the asynchronous model consumed 351 MB. CPU usage was 26.9% for the reactive model and 28.7% for the asynchronous model. The average response time was 231 ms for the reactive model and 281 ms for the asynchronous model. The 90 th percentile response time was 294 ms for the reactive model and 688 ms for the asynchronous model. Throughput was measured at 3714 req/s for the reactive model and 2965 req/s for the asynchronous model. The fourth scenario being evaluated was to retrieve a user's messages.