ชุมชนนักพัฒนา Java กำลังพูดถึงกันอย่างคึกคักเกี่ยวกับ Gradle plugin ทดลองใหม่ที่อ้างว่าสามารถเพิ่มความเร็วในการคอมไพล์ได้อย่างมากโดยการแทนที่ javac
แบบดั้งเดิมด้วยแนวทาง native binary Elide Gradle Plugin ใช้ประโยชน์จากเทคโนโลยี native image ของ GraalVM เพื่อกำจัดความล่าช้าจาก JIT warmup ที่มักจะทำให้การคอมไพล์ Java ช้าลงในกระบวนการ build มาตรฐาน
Native Binary กำจัดปัญหาคอขวด JIT Warmup
นวัตกรรมหลักที่อยู่เบื้องหลังการเพิ่มประสิทธิภาพของ Elide อยู่ที่แนวทางการคอมไพล์ Java แทนที่จะใช้ Tooling API เริ่มต้นของ Gradle ซึ่งรัน javac
ภายใน JVM ของ Gradle daemon และประสบปัญหาความล่าช้าจาก JIT warmup Elide ใช้เวอร์ชัน native binary ของคอมไพเลอร์ ซึ่งหมายความว่าการคอมไพล์จะเริ่มต้นทันทีด้วยความเร็วเต็มที่โดยไม่ต้องรอให้ Java Virtual Machine ปรับปรุงโค้ดผ่าน Just-In-Time compilation
Plugin นี้ทำงานโดยการกำหนดค่า JavaCompile
tasks ของ Gradle ให้ fork processes และใช้ executable แบบกำหนดเองที่เรียก elide javac
แทน javac
มาตรฐาน เนื่องจาก Elide ถูกสร้างเป็น GraalVM native image จึงข้ามขั้นตอน JIT warmup ทั้งหมดที่ปกติจะทำให้งานคอมไพล์ขนาดเล็กถึงกลางช้าลง
ข้อกำหนดทางเทคนิค
- ต้องติดตั้ง Elide แยกต่างหาก
- ต้องสร้าง
javac
shim ด้วยตนเองในJAVA_HOME/bin/elide-javac
- ต้องมีไฟล์ manifest
elide.pkl
สำหรับการจัดการ dependency - รองรับ JDK 8+ ผ่าน flags
--source/--target/--release
การปรับปรุงประสิทธิภาพที่สำคัญสำหรับโปรเจกต์ขนาดเล็ก
การสนทนาในชุมชนเผยให้เห็นว่าประโยชน์ด้านประสิทธิภาพจะเด่นชัดที่สุดสำหรับโปรเจกต์ที่มีคลาสน้อยกว่า 10,000 คลาส ในสถานการณ์เหล่านี้ plugin สามารถให้ความเร็วการคอมไพล์ที่เร็วขึ้นถึง 20 เท่าเมื่อเปรียบเทียบกับ javac
มาตรฐาน ทำให้มีคุณค่าเป็นพิเศษสำหรับแอปพลิเคชันองค์กรทั่วไปและโค้ดเบสขนาดเล็กที่ JIT warmup overhead คิดเป็นสัดส่วนที่สำคัญของเวลา build ทั้งหมด
ข้อได้เปรียบด้านประสิทธิภาพมาจากความจริงที่ว่าโปรเจกต์ Java หลายโปรเจกต์ไม่เคยไปถึงจุดที่ JIT optimization จะมีประโยชน์ การที่ Gradle มุ่งเน้นไปที่ incremental compilation และ build caching แม้จะช่วยได้ในเรื่องอื่น แต่กลับทำงานในทิศทางตรงกันข้ามกับการไปถึงสถานะ warm JIT ที่จะทำให้ javac
แบบดั้งเดิมมีความสามารถในการแข่งขัน
การอ้างสมรรถนะ
- เร็วกว่าการคอมไพล์แบบมาตรฐานของ
javac
ได้มากถึง 20 เท่า - มีประสิทธิภาพสูงสุดสำหรับโปรเจกต์ที่มีคลาสน้อยกว่า 10,000 คลาส
- ไบนารีแบบ native ช่วยขจัดความล่าช้าจากการ warmup ของ JIT
- การจัดการ HTTP ที่ได้รับการปรับปรุงสำหรับการแก้ไข dependency
Dependency Resolution ได้รับการเพิ่มความเร็วแบบ Native
นอกเหนือจากการคอมไพล์แล้ว Elide ยังเร่งความเร็ว Maven dependency resolution โดยการฝัง Maven resolver ใน native binary Plugin สามารถแทนที่กลไก dependency fetching ของ Gradle ทั้งหมด โดยดาวน์โหลด JARs ไปยังโครงสร้าง local Maven-compatible repository ที่ Gradle สามารถใช้ได้โดยตรง
Gradle ดูเหมือนจะถูกจำกัดให้อยู่กับ HTTP/1.1 และ connection pooling ที่แย่แม้ในปัจจุบัน ดังนั้นจึงไม่ยากที่จะเอาชนะมัน
แนวทางนี้ให้ resolution semantics ที่เหมือนกับ Maven ในขณะที่ให้ประสิทธิภาพที่เร็วกว่าผ่าน native execution และการจัดการ HTTP ที่ปรับปรุงแล้ว
ตัวเลือกการกำหนดค่า Plugin
enableInstall
: ใช้ Maven resolver ของ Elide (ค่าเริ่มต้น: true เมื่อมี elide.pkl อยู่)enableJavaCompiler
: ใช้ Elide สำหรับการคอมไพล์ Java (ค่าเริ่มต้น: true)enableProjectIntegration
: เปิดใช้งานการรับรู้โปรเจกต์ของ Elide (ค่าเริ่มต้น: สามารถกำหนดค่าได้)manifest
: เส้นทางไปยังไฟล์ manifest ของโปรเจกต์ (ค่าเริ่มต้น: elide.pkl)
การติดตั้งต้องการขั้นตอนการตั้งค่าด้วยตนเอง
ปัจจุบันการใช้ plugin นี้ต้องสร้าง manual shim ในไดเร็กทอรี JAVA_HOME
ที่เปลี่ยนเส้นทางการเรียก javac
ไปยัง elide javac
ผู้ใช้ต้องติดตั้ง Elide แยกต่างหากก่อนใช้ plugin ทีมพัฒนายอมรับความซับซ้อนในการตั้งค่านี้และวางแผนที่จะกำจัดความต้องการ JAVA_HOME
shim ในเวอร์ชันอนาคต
Plugin ยังต้องการไฟล์ elide.pkl
manifest สำหรับการจัดการ dependency เมื่อใช้ฟีเจอร์ enhanced dependency resolution แม้ว่าข้อจำกัดนี้คาดว่าจะเปลี่ยนแปลงเมื่อโปรเจกต์พัฒนาขึ้น
Elide Gradle Plugin แสดงให้เห็นแนวทางที่น่าสนใจในการแก้ไขปัญหาประสิทธิภาพการคอมไพล์ cold-start ของ Java แม้ว่าจะยังอยู่ในขั้นทดลองและต้องการการตั้งค่าด้วยตนเองบางอย่าง แต่ก็ให้การปรับปรุงประสิทธิภาพที่น่าสนใจสำหรับนักพัฒนาที่ทำงานกับขนาดโปรเจกต์ Java ทั่วไป เมื่อเครื่องมือพัฒนาขึ้นและการตั้งค่าง่ายขึ้น มันอาจกลายเป็นตัวเลือกที่น่าสนใจสำหรับทีมที่ต้องการเร่งความเร็วกระบวนการ build โดยไม่เปลี่ยนแปลง workflow การพัฒนาพื้นฐาน
อ้างอิง: Elide Gradle Plugin