คอมไพเลอร์เช่น Javac ฉลาดพอที่จะตรวจจับเมื่อเมธอดเป็นฟังก์ชันที่บริสุทธิ์
มันไม่ใช่คำถามของ "ฉลาดพอ" สิ่งนี้เรียกว่าการวิเคราะห์ความบริสุทธิ์และไม่สามารถพิสูจน์ได้ในกรณีทั่วไป: เทียบเท่ากับการแก้ปัญหาการหยุดชะงัก
ตอนนี้แน่นอนว่าเครื่องมือเพิ่มประสิทธิภาพทำสิ่งที่เป็นไปไม่ได้อย่างพิสูจน์ได้ตลอดเวลา "ไม่สามารถพิสูจน์ได้ในกรณีทั่วไป" ไม่ได้หมายความว่ามันไม่ทำงาน แต่ก็หมายความว่ามันไม่สามารถทำงานได้ในทุกกรณี ดังนั้นในความเป็นจริงแล้วอัลกอริธึมที่จะตรวจสอบว่าฟังก์ชั่นนั้นบริสุทธิ์หรือไม่มันก็แค่นั้นบ่อยครั้งที่ผลลัพธ์จะเป็น "ฉันไม่รู้" ซึ่งหมายความว่าเพื่อเหตุผลด้านความปลอดภัยและความถูกต้องคุณต้องสมมติ ฟังก์ชั่นนี้อาจไม่บริสุทธิ์
และแม้แต่ในกรณีที่ใช้งานได้อัลกอริธึมก็ซับซ้อนและมีราคาแพง
ดังนั้นนั่นคือปัญหา # 1: ใช้งานได้สำหรับกรณีพิเศษเท่านั้น
ปัญหา # 2: ห้องสมุด เพื่อให้ฟังก์ชั่นมีความบริสุทธิ์มันสามารถเรียกฟังก์ชั่นที่บริสุทธิ์เท่านั้น (และฟังก์ชั่นเหล่านั้นสามารถเรียกฟังก์ชั่นที่บริสุทธิ์และอื่น ๆ เป็นต้น) เห็นได้ชัดว่า Javac รู้เพียงเกี่ยวกับ Java และรู้เพียงเกี่ยวกับโค้ดที่สามารถมองเห็นได้ ดังนั้นหากฟังก์ชันของคุณเรียกใช้ฟังก์ชันในหน่วยการคอมไพล์อื่นคุณไม่สามารถรู้ได้ว่ามันบริสุทธิ์หรือไม่ ถ้ามันเรียกฟังก์ชันที่เขียนด้วยภาษาอื่นคุณไม่รู้หรอก ถ้ามันเรียกฟังก์ชั่นในห้องสมุดที่อาจยังไม่ได้ติดตั้งคุณไม่สามารถรู้ได้ และอื่น ๆ
ใช้งานได้เฉพาะเมื่อคุณมีการวิเคราะห์ทั้งโปรแกรมเมื่อทั้งโปรแกรมเขียนเป็นภาษาเดียวกันและทั้งหมดจะถูกคอมไพล์ในคราวเดียว คุณไม่สามารถใช้ห้องสมุดใด ๆ
ปัญหา # 3: การกำหนดเวลา เมื่อคุณทราบว่าส่วนใดบริสุทธิ์แล้วคุณยังต้องจัดตารางเวลาเพื่อแยกเธรด หรือไม่. การเริ่มต้นและการหยุดเธรดมีราคาแพงมาก (โดยเฉพาะใน Java) แม้ว่าคุณจะเก็บเธรดพูลและไม่เริ่มหรือหยุดเธรดการสลับบริบทเธรดก็มีราคาแพงเช่นกัน คุณต้องแน่ใจว่าการคำนวณจะทำงานได้นานกว่าเวลาที่กำหนดไว้และการสลับบริบทไม่เช่นนั้นคุณจะสูญเสียประสิทธิภาพไม่ได้รับ
ตามที่คุณอาจเดาได้ในตอนนี้การหาระยะเวลาในการคำนวณจะเป็นไปไม่ได้ในกรณีทั่วไป (เราไม่สามารถคิดได้ว่าจะใช้เวลาจำนวน จำกัด เวลาเพียงอย่างเดียว) และหนักและแพงแม้ใน กรณีพิเศษ
นอกเหนือ: Javac และการเพิ่มประสิทธิภาพ โปรดทราบว่าการใช้งานส่วนใหญ่ของ javac ไม่ได้ทำการปรับแต่งมากมาย การดำเนินงานของ Oracle javac ตัวอย่างเช่นอาศัยอยู่กับเครื่องยนต์ต้นแบบที่จะทำเพิ่มประสิทธิภาพ สิ่งนี้นำไปสู่ปัญหาอีกชุดหนึ่งนั่นคือพูดว่า javac ตัดสินใจว่าฟังก์ชั่นเฉพาะนั้นบริสุทธิ์และมีราคาแพงพอและมันก็คอมไพล์มันให้ทำงานบนเธรดอื่น จากนั้นเครื่องมือเพิ่มประสิทธิภาพของแพลตฟอร์ม (เช่นคอมไพเลอร์ HotSpot C2 JIT) มาพร้อมและปรับฟังก์ชั่นทั้งหมดออกไป ตอนนี้คุณมีเธรดว่างเปล่าที่ไม่ทำอะไรเลย หรือลองจินตนาการอีกครั้งว่า javac ตัดสินใจที่จะกำหนดเวลาฟังก์ชั่นในเธรดอื่นและเครื่องมือเพิ่มประสิทธิภาพแพลตฟอร์มสามารถทำได้ ปรับให้เหมาะที่สุดอย่างสมบูรณ์ยกเว้นว่าไม่สามารถทำการอินไลน์ข้ามขอบเขตของเธรดและดังนั้นฟังก์ชันที่สามารถปรับให้เหมาะสมที่สุดได้นั้นจะถูกดำเนินการโดยไม่จำเป็น
ดังนั้นการทำอะไรแบบนี้จะสมเหตุสมผลจริงๆถ้าคุณมีคอมไพเลอร์เดี่ยวที่ทำให้การปรับให้เหมาะสมที่สุดในครั้งเดียวเพื่อให้คอมไพเลอร์รู้และสามารถใช้ประโยชน์จากการปรับแต่งที่แตกต่างกันทั้งหมดในระดับที่แตกต่างกัน
โปรดทราบว่าตัวอย่างเช่นคอมไพเลอร์ HotSpot C2 JIT จะดำเนินการ auto-vectorization บางอย่างซึ่งยังเป็นรูปแบบของการขนานอัตโนมัติ