Pertanyaan Mengapa sulit untuk mengalahkan AOT compiler dengan compiler JIT (dalam hal kinerja.)?


Saya berpikir bahwa kompiler JIT akhirnya akan mengalahkan compiler AOT dalam hal kinerja dari kode yang dikompilasi, karena keuntungan inheren dari JIT (dapat menggunakan informasi yang tersedia hanya pada saat runtime). Salah satu argumen adalah bahwa kompiler AOT dapat menghabiskan lebih banyak waktu untuk menyusun kode, tetapi server VM dapat menghabiskan banyak waktu juga.

Saya mengerti bahwa JIT tampaknya mengalahkan compiler AOT dalam beberapa kasus, tetapi mereka tampaknya masih ketinggalan dalam banyak kasus.

Jadi pertanyaan saya adalah, apa masalah spesifik dan sulit yang mencegah kompiler JIT untuk mengalahkan para compiler AOT?

EDIT:
Beberapa argumen umum:

  • Kompiler AOT dapat menghabiskan lebih banyak waktu untuk melakukan pengoptimalan tingkat lanjut -> Jika Anda menjalankan server VM selama berhari-hari, Anda dapat menghabiskan jumlah waktu yang sama, jika tidak lebih lama.
  • Penafsiran kode byte memiliki biaya -> Kebanyakan JIT mengkompilasi cache instruksi mesin asli anyways hari ini.

Namun suntingan lain:
Untuk contoh spesifik, lihat artikel ini: Meningkatkan Kinerja Swing: Kompilasi JIT vs AOT. Dari apa yang dapat saya kumpulkan dari artikel ini, penulis pada dasarnya mengatakan bahwa ketika tidak ada hotspot, keuntungan dari memiliki informasi runtime berkurang dan dengan demikian AOT tanpa overhead JIT, menang. Tetapi dengan 40% ?? Sepertinya itu tidak masuk akal. Apakah hanya kompiler JIT yang dibandingkan tidak disetel untuk situasi ini? Atau itu sesuatu yang lebih mendasar?


32
2017-09-29 00:28


asal


Jawaban:


Ada trade-off yang pasti antara kompilasi JIT dan AOT (sebelum waktunya).

Seperti yang Anda nyatakan, JIT memiliki akses ke informasi run-time yang dapat membantu dalam pengoptimalan. Ini termasuk data tentang mesin yang dijalankannya, memungkinkan pengoptimalan bawaan khusus platform. Namun, JIT juga memiliki overhead menerjemahkan kode byte ke instruksi asli.

Overhead ini sering menjadi jelas dalam aplikasi di mana cepat start-up atau dekat respon real-time diperlukan. JIT juga tidak efektif jika mesin tidak memiliki sumber daya yang cukup untuk pengoptimalan tingkat lanjut, atau jika sifat kode tersebut sedemikian rupa sehingga tidak dapat "Dioptimalkan secara agresif."

Misalnya, diambil dari artikel yang Anda tautkan:

... apa yang harus kita lakukan   meningkatkan tanpa adanya bottleneck kinerja yang jelas? Seperti yang Anda bisa   tebak, masalah yang sama ada untuk JIT dipandu profil   kompiler. Daripada beberapa titik panas yang dioptimalkan secara agresif,   ada banyak "titik hangat" yang tersisa utuh.

Kompiler AOT juga dapat menghabiskan waktu sebanyak yang mereka mau, sedangkan kompilasi JIT terikat oleh persyaratan waktu (untuk menjaga ketanggapan) dan sumber daya dari mesin klien. Untuk alasan ini, kompiler AOT dapat melakukan pengoptimalan kompleks yang akan terlalu mahal selama JIT.

Juga lihat pertanyaan SO ini: Kompiler JIT vs compiler offline


26
2017-09-29 01:16