/AdPro-Module5-Profiling

Modul 5: Java Profiling

Primary LanguageJava

Modul 5: Java Profiling

Tutorial Advanced Programming 2023/2024 Genap

  • Nama : Akmal Ramadhan
  • NPM : 2206081534
  • Kelas : Pemrograman Lanjut A

Reflection

Perbedaan JMeter dan Intellij Profiler

Perbedaan pendekatan performance testing dengan JMeter dan profiling dengan Intellij Profiler dalam konteks optimisasi performa aplikasi yaitu:

  • JMeter digunakan untuk mengukur performa aplikasi dengan cara mensimulasikan beban kerja yang tinggi pada aplikasi (aplikasi digunakan oleh banyak orang pada saat yang bersamaan), sedangkan
  • Intellij Profiler digunakan untuk mencari tahu bottleneck pada aplikasi yang menyebabkan performa aplikasi menjadi buruk atau lambat.

Proses Profiling

Proses profiling sangat berguna untuk menemukan bottleneck pada aplikasi yang menyebabkan performa aplikasi menjadi lambat. Selama proses ini, profiler akan mengumpulkan data dan menganalisis bagian-bagian yang menjadi bottleneck. Informasi yang kita peroleh bisa berupa CPU usage, memory allocation, garbage collection activity, dan thread concurrency.

Efektifitas IntelliJ Profiler

Menurut saya, Intellij Profiler sudah efektif dalam menemukan bottleneck pada aplikasi. Dengan flame graph yang disediakan oleh Intellij Profiler, kita bisa melihat bagian mana yang memakan waktu eksekusi yang lama. Selain itu, tab Method List memberikan kita informasi mengenai Execution time. Jika terdapat method yang kita optimisasi, kita bisa melihat perubahan Diff execution time dari method tersebut. Sehingga saya tidak perlu menghitung manual seberapa persen peningkatan performa yang saya dapatkan.

Tantangan dalam Performance Testing dan Profiling

Tantangan yang saya hadapi dalam melakukan performance testing dan profiling adalah:

  • Memahami Hasil Profiling: Saya harus paham dalam melihat hasil profiling agar dapat melakukan refactoring pada bottleneck yang saya temukan.
  • Melakukan Optimisasi: Setelah menemukan bottleneck, saya harus melakukan refactoring pada bottleneck tersebut agar performa aplikasi menjadi lebih baik dan bagi saya ini merupakan tantangan yang besar.

Manfaat IntelliJ Profiler

Selain yang sudah saya sebutkan pada Efektifitas Intellij Profiler, saya tidak perlu menggunakan third party apps lainnya untuk melakukan profiling karena sudah disediakan dalam satu IDE yang saya gunakan yaitu Intellij IDEA. Dengan begitu, saya tidak perlu melakukan setup yang rumit untuk profiling.

Inkonsistensi IntelliJ Profiler dan JMeter

Saya tidak mengalami hasil yang tidak konsisten dari dua alat tersebut. Namun, jika saya mengalami hal tersebut, hal yang saya lakukan adalah memeriksa kembali konfigurasi yang saya lakukan pada JMeter dan memeriksa kembali hasil profiling yang saya dapatkan dari Intellij Profiler. Jika masih inkonsisten, saya akan mencari tahu penyebabnya melalui search engine atau bertanya kepada dosen, kakak asdos, atau teman saya.

Implementasi Optimisasi Kode Aplikasi

Strategi yang saya lakukan untuk melakukan refactoring pada aplikasi adalah:

  • Mengurangi Jumlah Pemanggilan Database:

Hal ini saya lakukan pada method getAllStudentsWithCourses(). Sebelumnya, setiap kali mengakses daftar mahasiswa, kode melakukan panggilan database terpisah untuk setiap mahasiswa dengan mata kuliah yang diambil. Setelah di-refactor, saya menggunakan studentCourseRepository.findAll() untuk langsung mendapatkan semua data hubungan antara mahasiswa dan kursus dari database dalam satu pemanggilan. Lalu, saya memanfaatkan HashMap untuk ID mahasiswa. Dengan begitu, cukup iterasi StudentCourse untuk mencari mahasiswa yang sesuai dalam HashMap.

  • Perbaiki Struktur Data untuk Alokasi Memori:

Diterapkan dalam optimisasi method joinStudentNames(). Operasi concatenation atau += pada String memerlukan alokasi memori tambahan karena String bersifat immutable dan membuat objek baru setiap kali konkatensi dilakukan. Dengan begitu, sebaiknya menggunakan StringBuilder untuk mengurangi alokasi memori yang tidak perlu.

  • Optimisasi Query:

Saya lakukan pada method findStudentWithHighestGpa(). Sebelumnya, untuk mendapatkan mahasiswa dengan IPK tertinggi, kita melakukan iterasi semua mahasiswa dan compare IPK satu per satu. Untuk mengoptimalkannya, saya menggunakan query SELECT * FROM students ORDER BY gpa DESC LIMIT 1 yang diterapkan pada StudentRepository. Query ini mengambil mahasiswa dengan IPK tertinggi dengan mengurutkan secara menurun dan ambil satu anggota pertama.

Untuk memastikan bahwa optimisasi yang saya lakukan tidak mempengaruhi fungsionalitas aplikasi, saya dapat membuat sebuah unit test sebelumnya seperti yang sudah diajarkan pada minggu-minggu sebelumnya. Namun, pada latihan kali ini saya tidak melakukannya.

JMeter Report and Test Results

Endpoint /all-student

Test Result JMeter all-student Before Optimization JMeter: all-student After Optimization JMeter: all-student

Execution Time getAllStudentWithCourses() from Intellij Profiler:

Before After Diff Percentage
17,542 ms 1,466 ms 91.65%

Endpoint /all-student-name

Test Result JMeter: all-student-name Before Optimization JMeter: all-student-name After Optimization JMeter: all-student-name

Execution Time joinStudentNames() from Intellij Profiler:

Before After Diff Percentage
979 ms 230 ms 76.5%

Endpoint /highest-gpa

Test Result JMeter: highest-gpa Before Optimization JMeter: highest-gpa After Optimization JMeter: highest-gpa

Execution Time findStudentWithHighestGpa() from Intellij Profiler:

Before After Diff Percentage
180 ms 40 ms 77.7%

Dari gambar, terlihat bahwa terdapat peningkatan performa berdasarkan hasil sample time yang diperoleh. Waktu eksekusi sebelum optimisasi lebih lama dibandingkan waktu eksekusi setelah optimisasi. Hal yang saya simpulkan yaitu bahwa optimisasi yang saya lakukan berhasil menggunakan bantuan alat JMeter dan Intellij Profiler.