Sebelum melakukan optimize code, saya mengukur waktu respons setiap endpoint menggunakan Apache JMeter. Berikut hasilnya:
Hasil analisis menggunakan IntelliJ Profiler :
- Method
getAllStudentsWithCourses()
punya CPU time paling tinggi karena melakukan banyak query ke database dalam loop (N+1 Problem). - Method
joinStudentNames()
kurang optimal karena menggunakan string concatenation yang berulang. - Method
findStudentWithHighestGpa()
melakukan iterasi terhadap semua data mahasiswa tanpa memanfaatkan query database secara efisien.
- Menggunakan JOIN FETCH di JPA Queries untuk mengatasi N+1 Problem dan mengurangi jumlah query yang dieksekusi.
- Mengoptimalkan pemrosesan string dengan
Collectors.joining(", ")
untuk menghindari overhead dari string concatenation. - Menggunakan (
@Query
di repository) supaya filtering dan sorting dilakukan langsung oleh database, bukan di dalam code.
Setelah optimization code dilakukan, saya menjalankan ulang testing dengan Apache JMeter untuk melihat peningkatan performa.
Endpoint | Sebelum Optimization (ms) | Setelah Optimization (ms) |
---|---|---|
/all-student |
~301,446 - 305,778 | ~518 - 811 |
/all-student-name |
~4,144 - 4,964 | ~35 - 176 |
/highest-gpa |
~164 - 344 ms | ~8 - 30 |
β Target optimization > 20% berhasil dicapai di semua endpoint ^_^
1οΈβ£ What is the difference between the approach of performance testing with JMeter and profiling with IntelliJ Profiler in the context of optimizing application performance?
Performance testing dengan JMeter lebih fokus pada load testing simulation, mengukur bagaimana app merespons ketika banyak request dikirim bersamaan. Ini membantu saya memahami response time, throughput, dan latency, serta mendeteksi bottleneck dari external side app.
Selain itu, profiling dengan IntelliJ Profiler bekerja di code level, menganalisis CPU usage, memory allocation, dan mengevaluasi efisiensi method dalam aplikasi.
JMeter menjawab "apa yang terjadi?" sedangkan Profiler menjawab "kenapa itu terjadi?".
2οΈβ£ How does the profiling process help you in identifying and understanding the weak points in your application?
Profiling menampilkan presisi bagian mana dari app yang paling banyak menggunakan resources.
Contohnya, methodgetAllStudentsWithCourses()
terdeteksi boros CPU time karena mengalami N+1 Query Problem, di mana setiap iterasi student menyebabkan query tambahan ke database.
Dengan flame graph, call tree, dan method list, saya bisa pinpoint root cause masalah performa dan mengoptimalkannya dengan JOIN FETCH.
3οΈβ£ Do you think IntelliJ Profiler is effective in assisting you to analyze and identify bottlenecks in your application code?
β Sangat efektif, karena IntelliJ Profiler memberikan visualisasi bagaimana CPU dan memory digunakan secara real-time, jadi saya bisa mendeteksi bottleneck dengan cepat.
πΉ Flame graph memudahkan melihat method yang paling boros resource.
πΉ Method list membantu menganalisis execution time tiap method.
πΉ Timeline view menampilkan CPU spikes dan method yang over-executing.
4οΈβ£ What are the main challenges you face when conducting performance testing and profiling, and how do you overcome these challenges?
π§ Variasi hasil evaluasi performa karena pengaruh JVM Just-In-Time (JIT) Compilation. Saat aplikasi pertama kali dijalankan, code belum dioptimasi oleh JIT, jadi lebih lama dibandingkan setelah beberapa kali eksekusi.
π§ N+1 Query Problem, yang tidak langsung terlihat di JMeter tapi terdeteksi di Profiler. Jadi saya menggunakan JOIN FETCH supaya database tidak ada repeated queries.
5οΈβ£ What are the main benefits you gain from using IntelliJ Profiler for profiling your application code?
- Deteksi bottleneck dengan cepat untuk melihat method yang paling boros CPU.
- Query Optimization untuk menganalisis apakah ada query yang tidak optimal.
- Membandingkan performa sebelum dan sesudah optimasi.
- Memastikan efisiensi CPU & Memory.
6οΈβ£ How do you handle situations where the results from profiling with IntelliJ Profiler are not entirely consistent with findings from performance testing using JMeter?
Kadang, hasil CPU time di Profiler menunjukkan peningkatan, tapi response time di JMeter masih tetap tinggi. Hal ini bisa disebabkan oleh beberapa faktor, seperti network latency atau server overload, database bottleneck yang terjadi di luar code aplikasi, atau overhead dari sistem eksternal lainnya yang memengaruhi waktu respons secara keseluruhan.
π― Solusi yang saya lakukan sebagai berikut:
- Cross-validation antara hasil JMeter & Profiler.
- Pastikan database & server stabil sebelum testing.
- Gunakan profiling untuk isolate masalah spesifik dalam code.
7οΈβ£ What strategies do you implement in optimizing application code after analyzing results from performance testing and profiling? How do you ensure the changes you make do not affect the application's functionality??
π― Optimizing yang saya lakukan:
- Database Query Optimization: Menggunakan JOIN FETCH untuk menghilangkan N+1 Query Problem.
- Java Stream API Optimization: Mengubah loop manual ke stream processing supaya lebih efisien.
- Avoiding Unnecessary Object Creation: Menggunakan Collectors.joining() untuk penggabungan string.
- Utilizing Database Indexing: Memastikan query filtering lebih cepat dengan indexing di database.
- Refactoring Code untuk Reduce CPU Time: Mengambil hanya field yang diperlukan untuk mengurangi beban app.
β Cara saya memastikan tidak merusak Application's Functionality:
- Unit Testing & Integration Testing setelah setiap perubahan.
- Regression Testing dengan Postman untuk memastikan response API tetap valid.
- Membandingkan hasil JMeter sebelum dan sesudah optimasi untuk memastikan >= 20% peningkatan performa.
- Profiling ulang dengan IntelliJ Profiler untuk melihat dampak optimasi pada CPU Time & query execution.