คำถามติดแท็ก jit

Just-In-Time compilation (JIT) เป็นเทคนิคที่ใช้ในการปรับปรุงประสิทธิภาพของโค้ดที่ตีความโดยการแปลเป็นรหัสเครื่อง

10
ทำไม 2 * (i * i) เร็วกว่า 2 * i * i ใน Java
โปรแกรม Java ต่อไปนี้ใช้เวลาเฉลี่ยระหว่าง 0.50 วินาทีและ 0.55 วินาทีเพื่อให้ทำงาน: public static void main(String[] args) { long startTime = System.nanoTime(); int n = 0; for (int i = 0; i < 1000000000; i++) { n += 2 * (i * i); } System.out.println((double) (System.nanoTime() - startTime) / 1000000000 + " s"); System.out.println("n = …

12
ทำไมฉันไม่ควรใช้ PyPy กับ CPython ถ้า PyPy เร็วกว่า 6.3 เท่า?
ฉันได้ยินมามากมายเกี่ยวกับโครงการPyPy พวกเขาอ้างว่ามันคือ 6.3 ครั้งเร็วกว่าCPythonล่ามบนเว็บไซต์ของพวกเขา เมื่อใดก็ตามที่เราพูดถึงภาษาไดนามิกเช่น Python ความเร็วเป็นหนึ่งในปัญหาอันดับต้น ๆ เพื่อแก้ปัญหานี้พวกเขาบอกว่า PyPy เร็วขึ้น 6.3 เท่า ปัญหาที่สองคือการขนานกันInterpreter Lock (GIL) ที่น่าอับอาย สำหรับเรื่องนี้ PyPy บอกว่ามันสามารถให้ GIL น้อยหลาม หาก PyPy สามารถแก้ปัญหาความท้าทายที่ยิ่งใหญ่เหล่านี้อะไรคือจุดอ่อนที่ป้องกันการยอมรับในวงกว้าง? นั่นคือจะบอกว่าสิ่งที่ป้องกันไม่ให้คนอย่างผมซึ่งเป็นผู้พัฒนาหลามทั่วไปจากการเปลี่ยนไป PyPy ในขณะนี้ ?


2
Java JIT โกงเมื่อใช้งานรหัส JDK หรือไม่
ฉันกำลังทำการเปรียบเทียบโค้ดบางตัวและไม่สามารถทำให้มันรันเร็วเหมือนกับjava.math.BigIntegerแม้ว่าจะใช้อัลกอริทึมแบบเดียวกันก็ตาม ดังนั้นฉันจึงคัดลอกjava.math.BigIntegerซอร์สไปยังแพ็คเกจของฉันและลองทำสิ่งนี้ //import java.math.BigInteger; public class MultiplyTest { public static void main(String[] args) { Random r = new Random(1); long tm = 0, count = 0,result=0; for (int i = 0; i < 400000; i++) { int s1 = 400, s2 = 400; BigInteger a = new BigInteger(s1 * 8, …
405 java  jvm  jit  jvm-hotspot 

3
. NET JIT เกิดข้อผิดพลาดหรือไม่
รหัสต่อไปนี้ให้ผลลัพธ์ที่แตกต่างกันเมื่อใช้งานรีลีสภายใน Visual Studio และรันรีลีสภายนอก Visual Studio ฉันใช้ Visual Studio 2008 และกำหนดเป้าหมาย. NET 3.5 ฉันเคยลอง. NET 3.5 SP1 แล้ว เมื่อทำงานนอก Visual Studio JIT ควรเริ่มต้นด้วย (ก) มีบางสิ่งบางอย่างเกิดขึ้นกับ C # ที่ฉันหายไปหรือ (b) JIT นั้นผิดพลาดจริง ๆ ฉันสงสัยว่า JIT สามารถไปผิดได้ แต่ฉันหมดความเป็นไปได้อื่น ๆ ... เอาต์พุตเมื่อทำงานภายใน Visual Studio: 0 0, 0 1, 1 0, 1 1, เอาต์พุตเมื่อเรียกใช้รีลีสนอก …
404 c#  jit 

5
ทำไม JVM แคช JIT คอมไพล์โค้ดไม่ได้
การใช้งาน JVM ที่เป็นที่ยอมรับจาก Sun ใช้การเพิ่มประสิทธิภาพที่ค่อนข้างซับซ้อนบางอย่างกับ bytecode เพื่อให้ได้ความเร็วในการดำเนินการที่ใกล้เคียงกับเนทีฟหลังจากที่โค้ดถูกเรียกใช้ไปสองสามครั้ง คำถามคือเหตุใดโค้ดที่คอมไพล์นี้จึงไม่ถูกแคชลงในดิสก์เพื่อใช้ระหว่างการใช้ฟังก์ชัน / คลาสเดียวกันในภายหลัง ตามที่กล่าวมาทุกครั้งที่เรียกใช้งานโปรแกรมคอมไพเลอร์ JIT จะเริ่มทำงานใหม่แทนที่จะใช้โค้ดเวอร์ชันที่คอมไพล์ไว้ล่วงหน้า การเพิ่มคุณสมบัตินี้จะไม่เพิ่มการเพิ่มที่สำคัญให้กับเวลารันเริ่มต้นของโปรแกรมเมื่อมีการตีความ bytecode เป็นหลักหรือไม่?
107 java  caching  jvm  compilation  jit 

8
คอมไพเลอร์ JIT ของ JVM สร้างโค้ดที่ใช้คำแนะนำจุดลอยตัวแบบเวกเตอร์หรือไม่
สมมติว่าปัญหาคอขวดของโปรแกรม Java ของฉันคือลูปที่แน่นพอที่จะคำนวณผลิตภัณฑ์จุดเวกเตอร์จำนวนมาก ใช่ฉันได้ทำโปรไฟล์แล้วใช่มันเป็นคอขวดใช่มันสำคัญใช่นั่นเป็นเพียงวิธีการที่อัลกอริทึมใช่ฉันใช้ Proguard เพื่อเพิ่มประสิทธิภาพโค้ดไบต์ ฯลฯ งานคือโดยพื้นฐานแล้วผลิตภัณฑ์ดอท เช่นเดียวกับฉันมีสองfloat[50]และฉันต้องคำนวณผลรวมของผลิตภัณฑ์คู่กัน ฉันรู้ว่าชุดคำสั่งโปรเซสเซอร์มีอยู่เพื่อดำเนินการประเภทนี้อย่างรวดเร็วและจำนวนมากเช่น SSE หรือ MMX ใช่ฉันสามารถเข้าถึงสิ่งเหล่านี้ได้โดยการเขียนโค้ดเนทีฟใน JNI การโทรของ JNI นั้นค่อนข้างแพง ฉันรู้ว่าคุณไม่สามารถรับประกันได้ว่า JIT จะรวบรวมหรือไม่รวบรวมอะไร มีใครเคยได้ยินเกี่ยวกับรหัสสร้าง JIT ที่ใช้คำแนะนำเหล่านี้หรือไม่? และถ้าเป็นเช่นนั้นมีอะไรเกี่ยวกับโค้ด Java ที่ช่วยให้คอมไพล์ได้ด้วยวิธีนี้หรือไม่? น่าจะเป็น "ไม่"; คุ้มค่าที่จะถาม

4
เทคนิคการกลับด้านลูปคืออะไร?
ฉันกำลังอ่านเอกสารที่พูดถึงเทคนิคการเพิ่มประสิทธิภาพคอมไพเลอร์แบบทันเวลา (JIT) สำหรับ Java หนึ่งในนั้นคือ "loop inversion" และเอกสารระบุว่า: คุณแทนที่whileลูปปกติด้วยdo-whileลูป และ do-whileลูปถูกตั้งค่าภายในifอนุประโยค การเปลี่ยนนี้ทำให้กระโดดน้อยลงสองครั้ง การผกผันของลูปทำงานอย่างไรและเพิ่มประสิทธิภาพเส้นทางรหัสของเราอย่างไร หมายเหตุ: จะดีมากถ้าใครสักคนสามารถอธิบายด้วยตัวอย่างของโค้ด Java และวิธีที่ JIT ปรับให้เหมาะสมกับโค้ดเนทีฟและเหตุใดจึงเหมาะสมที่สุดในโปรเซสเซอร์สมัยใหม่

5
การคอมไพล์ C # JIT และ. NET
ฉันสับสนเล็กน้อยเกี่ยวกับรายละเอียดของการทำงานของคอมไพเลอร์ JIT ฉันรู้ว่า C # รวบรวมลงไปที่ IL ครั้งแรกที่เรียกใช้คือ JIT'd สิ่งนี้เกี่ยวข้องกับการแปลเป็นรหัสดั้งเดิมหรือไม่ รันไทม์. NET (เป็น Virtual Machine หรือไม่) โต้ตอบกับรหัส JIT? ฉันรู้ว่ามันไร้เดียงสา แต่ฉันสับสนตัวเองจริงๆ ความประทับใจของฉันคือเสมอว่าแอสเซมบลีไม่ได้ถูกตีความโดยรันไทม์. NET แต่ฉันไม่เข้าใจรายละเอียดของการโต้ตอบ
87 c#  jit 

4
เป็นไปได้ไหมที่จะเขียนคอมไพเลอร์ JIT (ไปยังโค้ดเนทีฟ) ทั้งหมดในภาษา. NET ที่มีการจัดการ
ฉันคิดว่าจะเขียนคอมไพเลอร์ JIT และฉันแค่สงสัยว่าในทางทฤษฎีเป็นไปได้หรือไม่ที่จะเขียนสิ่งทั้งหมดในโค้ดที่มีการจัดการ โดยเฉพาะอย่างยิ่งเมื่อคุณสร้างแอสเซมเบลอร์ในอาร์เรย์ไบต์แล้วคุณจะเข้าสู่แอสเซมเบลอร์เพื่อเริ่มต้นการดำเนินการได้อย่างไร?
84 c#  .net  f#  jit 

8
เหตุใดโอเปอเรเตอร์จึงช้ากว่าการเรียกใช้เมธอดมาก (โครงสร้างจะช้าลงเฉพาะใน JIT ที่เก่ากว่า)
Intro: ฉันเขียนโค้ดประสิทธิภาพสูงใน C # ใช่ฉันรู้ว่า C ++ จะให้การเพิ่มประสิทธิภาพที่ดีขึ้น แต่ฉันก็ยังเลือกที่จะใช้ C # ฉันไม่ต้องการที่จะอภิปรายทางเลือกนั้น แต่ฉันอยากได้ยินจากคนที่พยายามเขียนโค้ดประสิทธิภาพสูงบน. NET Framework คำถาม: เหตุใดตัวดำเนินการในรหัสด้านล่างจึงช้ากว่าการเรียกเมธอดเทียบเท่า ?? เหตุใดวิธีการส่งผ่านสองคู่ในโค้ดด้านล่างเร็วกว่าวิธีการที่เทียบเท่ากันโดยผ่านโครงสร้างที่มีสองคู่อยู่ภายใน (A: JIT รุ่นเก่าปรับโครงสร้างให้เหมาะสมไม่ดี) มีวิธีรับ. NET JIT Compiler เพื่อจัดการโครงสร้างอย่างง่ายได้อย่างมีประสิทธิภาพเทียบเท่ากับสมาชิกของโครงสร้างหรือไม่ (A: รับ JIT ใหม่กว่า) สิ่งที่ฉันคิดว่าฉันรู้: คอมไพเลอร์. NET JIT ดั้งเดิมจะไม่อินไลน์อะไรที่เกี่ยวข้องกับโครงสร้าง ควรใช้โครงสร้างที่แปลกประหลาดเฉพาะเมื่อคุณต้องการประเภทค่าขนาดเล็กที่ควรปรับให้เหมาะสมเช่นบิวท์อิน แต่เป็นจริง โชคดีที่ใน. NET 3.5SP1 และ. (ฉันเดาว่าพวกเขาทำอย่างนั้นเพราะไม่เช่นนั้นโครงสร้างซับซ้อนใหม่ที่พวกเขาแนะนำจะมีประสิทธิภาพที่น่ากลัว ... ไม่เกี่ยวข้องกับปัญหานี้มากเกินไป สิ่งที่การทดสอบของฉันแสดงให้เห็น: ฉันได้ตรวจสอบแล้วว่าฉันมี JIT Optimizer รุ่นใหม่กว่าโดยตรวจสอบว่าไฟล์ …


2
Java: ลูปที่ไม่ได้ควบคุมด้วยตนเองยังคงเร็วกว่าลูปดั้งเดิม ทำไม?
ลองพิจารณาตัวอย่างของโค้ดสองชุดต่อไปนี้ในอาร์เรย์ที่มีความยาว 2: boolean isOK(int i) { for (int j = 0; j < filters.length; ++j) { if (!filters[j].isOK(i)) { return false; } } return true; } และ boolean isOK(int i) { return filters[0].isOK(i) && filters[1].isOK(i); } ฉันคิดว่าประสิทธิภาพของสองชิ้นนี้ควรจะคล้ายกันหลังจากการวอร์มอัพเพียงพอ ฉันได้ตรวจสอบสิ่งนี้โดยใช้กรอบการเปรียบเทียบไมโคร JMH ตามที่อธิบายไว้เช่นที่นี่และที่นี่และสังเกตว่าตัวอย่างที่สองนั้นเร็วกว่า 10% คำถาม: ทำไม Java ถึงไม่ปรับข้อมูลโค้ดแรกของฉันให้ดีขึ้นโดยใช้เทคนิคการปลดลูปพื้นฐาน โดยเฉพาะฉันต้องการทำความเข้าใจสิ่งต่อไปนี้: ฉันสามารถผลิตรหัสที่เป็นที่เหมาะสมสำหรับกรณีของ 2 ตัวกรองและยังคงสามารถทำงานในกรณีของหมายเลขอื่นของตัวกรอง (จินตนาการสร้างง่าย) …

1
การเขียนโค้ด Javascript ที่มีประสิทธิภาพสูงโดยไม่ทำให้เสียเวลา
เมื่อเขียนโค้ดที่ไวต่อประสิทธิภาพใน Javascript ซึ่งทำงานในอาร์เรย์ตัวเลขขนาดใหญ่ (คิดว่าเป็นแพคเกจพีชคณิตเชิงเส้นการทำงานกับจำนวนเต็มหรือตัวเลขทศนิยม) หนึ่งต้องการให้ JIT ช่วยเท่าที่จะทำได้ ประมาณนี้หมายถึง: เราต้องการให้อาร์เรย์ของเราบรรจุ SMIs (จำนวนเต็มเล็กน้อย) หรือบรรจุคู่ขึ้นอยู่กับว่าเราทำการคำนวณจำนวนเต็มหรือทศนิยม เราต้องการที่จะส่งสิ่งประเภทเดียวกันไปยังฟังก์ชั่นเสมอเพื่อที่พวกเขาจะไม่ได้รับป้ายกำกับ "megamorphic" และ deoptimised ตัวอย่างเช่นเราต้องการที่จะโทรหาvec.add(x, y)ทั้งคู่xและyเป็นอาร์เรย์ SMI ที่บรรจุอยู่หรือทั้งสองอาร์เรย์ที่บรรจุแล้ว เราต้องการให้ฟังก์ชั่นอินไลน์มากที่สุด เมื่อมีหนึ่งเร่ร่อนอยู่นอกกรณีเหล่านี้จะมีการลดลงของประสิทธิภาพการทำงานอย่างกะทันหันและรุนแรง สิ่งนี้สามารถเกิดขึ้นได้ด้วยเหตุผลที่ไม่น่ากลัวหลายประการ: คุณอาจเปิด SMI myArray.map(x => -x)อาร์เรย์บรรจุลงในบรรจุอาร์เรย์คู่ผ่านการดำเนินการที่ดูเหมือนไม่มีอันตรายเช่นเทียบเท่า นี่เป็นกรณีที่แย่ที่สุด "ดีที่สุด" เนื่องจากอาร์เรย์ Double ที่บรรจุอยู่นั้นยังคงเร็วมาก คุณอาจจะกลายอาร์เรย์ที่บรรจุลงในกล่องอาร์เรย์ทั่วไปตัวอย่างเช่นโดยการทำแผนที่อาร์เรย์มากกว่าฟังก์ชั่นที่ (โดยไม่คาดคิด) กลับหรือnull undefinedกรณีที่ไม่ดีนี้ค่อนข้างง่ายที่จะหลีกเลี่ยง คุณอาจ deoptimise ฟังก์ชั่นทั้งหมดเช่นvec.add()โดยผ่านสิ่งต่าง ๆ มากเกินไปและเปลี่ยนเป็น megamorphic สิ่งนี้อาจเกิดขึ้นได้หากคุณต้องการทำ "การเขียนโปรแกรมทั่วไป" ซึ่งvec.add()จะใช้ทั้งในกรณีที่คุณไม่ได้ระมัดระวังเกี่ยวกับประเภท (ดังนั้นจึงเห็นหลายประเภทเข้ามา) และในกรณีที่คุณต้องการประสิทธิภาพสูงสุด (มันควรจะได้รับคู่ผสมชนิดบรรจุกล่องเท่านั้น) คำถามของฉันเป็นคำถามที่อ่อนกว่าเกี่ยวกับวิธีการเขียนโค้ด …

1
ทำลายการเพิ่มประสิทธิภาพของ JIT พร้อมการสะท้อนกลับ
เมื่อเล่นซอกับการทดสอบหน่วยสำหรับคลาสซิงเกิลตันที่เกิดขึ้นพร้อมกันสูงฉันสะดุดกับพฤติกรรมแปลก ๆ ต่อไปนี้ (ทดสอบบน JDK 1.8.0_162): private static class SingletonClass { static final SingletonClass INSTANCE = new SingletonClass(0); final int value; static SingletonClass getInstance() { return INSTANCE; } SingletonClass(int value) { this.value = value; } } public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { System.out.println(SingletonClass.getInstance().value); // 0 // Change …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.