Python ทำไมช้ากว่า Java แต่เร็วกว่า PHP [ปิด]


17

ฉันได้เห็นการวัดเปรียบเทียบหลายครั้งหลายครั้งที่แสดงให้เห็นว่าภาษาหลายภาษาทำงานในหน้าที่ที่ได้รับมอบหมาย

การเปรียบเทียบเหล่านี้มักจะเปิดเผยว่า Python ช้ากว่า Java และเร็วกว่า PHP และฉันสงสัยว่าทำไมถึงเป็นเช่นนั้น

  • Java, Python และ PHP ทำงานในเครื่องเสมือน
  • ทั้งสามภาษาแปลงโปรแกรมเป็นรหัสไบต์แบบกำหนดเองที่ทำงานอยู่ด้านบนของระบบปฏิบัติการดังนั้นจึงไม่มีใครทำงานได้ตามปกติ
  • ทั้ง Java และ Python สามารถ "รวบรวม" ( .pycสำหรับ Python) แต่__main__โมดูลสำหรับ Python ไม่ได้รวบรวม

Python และ PHP ถูกพิมพ์แบบไดนามิกและ Java เป็นแบบคงที่ - นี่คือเหตุผลที่ Java เร็วขึ้นและถ้าเป็นเช่นนั้นโปรดอธิบายว่ามันมีผลต่อความเร็วอย่างไร

และถึงแม้ว่าอาร์กิวเมนต์ dynamic-vs-static นั้นถูกต้อง แต่ก็ไม่ได้อธิบายว่าทำไม PHP ถึงช้ากว่า Python เพราะทั้งคู่เป็นภาษาไดนามิก

คุณสามารถดูการวัดประสิทธิภาพได้ที่นี่และที่นี่และที่นี่


เกี่ยวกับ Python กับ PHP: เป็นเพียงปัญหาคุณภาพของการนำไปใช้งานส่วนใหญ่แล้ว
Charles Salvia

8
@good_computer มาตรฐานส่วนใหญ่ทำไม่ดีมาก มีอีกอันหนึ่งเมื่อไม่นานมานี้ (ฉันไม่คิดว่าคุณจะเชื่อมโยง) คนส่วนใหญ่ที่ตรวจสอบนั้นบ่นว่าภาษาที่อ้างว่าเป็น "เร็วที่สุด" นั้นมีรหัสที่ดีที่สุด สิ่งนี้มักจะทำโดยไม่รู้ตัวโดยคนที่ไม่คุ้นเคยกับภาษาที่ลงท้ายด้วยการถือว่า "ช้า" ดังนั้นพวกเขาจึงไม่รู้ว่าพวกเขากำลังเขียนโค้ดที่ดีกว่าในสิ่งที่พวกเขาพบว่าเป็น "เร็ว"
Izkata

@good_computer ดูเหมือนว่าคุณกำลังอ้างสิทธิ์บางสิ่งเนื่องจากคำถามของคุณมีข้อความว่า " มาตรฐานเหล่านี้เสมอแสดงว่า Python ช้ากว่า Java และเร็วกว่า PHP " และ " PHP ช้ากว่า Python " การลบเครื่องหมายคำพูดเหล่านั้นออกและการตั้งคำถามใหม่เพื่อให้เป็นผู้ไม่เชื่อเรื่องภาษาสามารถเปิดใหม่ได้
briddums

คำถามนี้มีอคติจริงๆ: (1) อ้างถึงการวัดแบบไม่ใช้อำนาจดำเนินการกับโค้ดที่ไม่ได้รับการเพิ่มประสิทธิภาพอย่างไร้เดียงสาที่เขียนโดยโปรแกรมเมอร์สามเณรในภาษาที่พวกเขาไม่ได้เชี่ยวชาญ เกี่ยวกับการตีความ / ภาษา bytecode (PHP / หลามจะถูกตีความ, Java ของ bytecoded หลามไฟล์แคชต้นไม้นามธรรมไวยากรณ์ไม่ bytecode)และรัฐในสามภาษา(มีรวบรวมรุ่นของทั้งสองหลามและ PHP - ของงูหลามกำลังผู้ใหญ่มากขึ้นรวบรวม แม้ว่า php จะทำงานบน facebook)
ZJR

คำตอบ:


26

รหัส JVM สามารถเรียบเรียง JIT ได้อย่างมีประสิทธิภาพโดยใช้คอมไพเลอร์เฉพาะกิจ (เล็กน้อย) ที่รวดเร็ว แต่สิ่งเดียวกันจะยากสำหรับ PHP และ Python เนื่องจากลักษณะที่พิมพ์แบบไดนามิกของมัน JVM แปลเป็นรหัสเนวิเกเตอร์ที่ค่อนข้างต่ำและตรงไปตรงมาค่อนข้างคล้ายกับสิ่งที่คอมไพเลอร์ C ++ จะผลิต แต่สำหรับภาษาแบบไดนามิกคุณจะต้องสร้างการแจกจ่ายแบบไดนามิกสำหรับการดำเนินการพื้นฐานทั้งหมดและการเรียกใช้เมธอดทั้งหมด การจัดส่งแบบไดนามิกนี้เป็นคอขวดหลักสำหรับทุกภาษาในประเภทนี้

ในบางกรณีมีความเป็นไปได้ที่จะกำจัดการกระจายแบบไดนามิก (เช่นเดียวกับการโทรเสมือนใน Java) โดยใช้คอมไพเลอร์ JIT การติดตามที่ซับซ้อนมากขึ้น วิธีการนี้ยังอยู่ในช่วงวัยเด็กไม่ได้ตีความตีความนามธรรมมากเกินไปและคอมไพเลอร์มีแนวโน้มที่จะหายใจไม่evalออก (ซึ่งเป็นเรื่องปกติสำหรับภาษาไดนามิก)

สำหรับความแตกต่างระหว่าง Python และ PHP สิ่งหลังมีคุณภาพต่ำกว่ามาก มันสามารถทำงานได้เร็วขึ้นในทางทฤษฎี แต่ไม่เคยทำ


1
ทำไม JIT "ล้ำล้ำ" ยากสำหรับภาษาแบบไดนามิก? ดู v8 หรือ TraceMonkey ในโลก JavaScript - JIT ใช้งานได้ดี
treecoder

6
@good_computer การติดตาม JIT นั้นซับซ้อนกว่าปกติมาก JIT แบบเฉพาะกิจและพวกเขายังคงทำงานช้ากว่า JIT สำหรับภาษาที่พิมพ์แบบคงที่ การติดตาม JIT ที่เหมาะสมจะเกี่ยวข้องกับการตีความเชิงนามธรรมอย่างเต็มรูปแบบและมันจะทำให้หายใจไม่ออกในการevalโทรแต่ละครั้งและทุกครั้ง
SK-logic

2
อาจมีวิศวกรประมาณหนึ่งร้อยคนในทีมคอมไพเลอร์ HotSpot ของออราเคิลซึ่งจะไม่เห็นด้วยกับส่วนที่ "ไม่สำคัญ":
Jörg W Mittag

1
@ JörgWMittagแน่นอนว่า HotSpot นั้นไม่ตรงไปตรงมามันทำการวิเคราะห์แบบสแตติกเล็กน้อยโดยใช้ผลการทำโปรไฟล์แบบรันไทม์ แต่ก็ยังง่ายกว่าการติดตาม JIT ที่เหมาะสม และฉันจะบอกว่า HotSpot มีความซับซ้อนมากเกินไปและการนำไปปฏิบัติก็คือการพูดอย่างสุภาพเล็กน้อยเกินไป
SK-logic

1
@ Frank Shearar, เฉพาะกิจ JIT สำหรับภาษาแบบไดนามิกนั้นไม่สำคัญเท่ากับการพิมพ์แบบคงที่ (ดูตัวอย่าง LuaJIT) OTOH JIT ที่มีประสิทธิภาพเป็นสิ่งที่แตกต่างอย่างสิ้นเชิง
SK-logic

21

มีปัญหาทั่วไปเกี่ยวกับคำถามนี้เพราะมันสมบูรณ์เกินไป ไม่สมเหตุสมผลที่จะพูดว่า "ภาษา X เร็วกว่าภาษา Y" ภาษาคอมพิวเตอร์นั้นไม่ได้ "เร็ว" หรือ "ช้า" เพราะเป็นเพียงวิธีการแสดงอัลกอริทึม คำถามที่แท้จริงควรเป็นสิ่งที่อยู่ในลำดับของ "ทำไมการใช้งาน X1 ของภาษา X เร็วกว่าการใช้ Y1 ของภาษา Y สำหรับโดเมนปัญหานี้โดยเฉพาะ?"

ความแตกต่างของความเร็วบางอย่างจะหลุดออกไปจากภาษาของตัวเองเนื่องจากภาษาบางภาษาสามารถใช้งานโดเมนได้ง่ายกว่าบางโดเมน แต่สิ่งที่ทำให้การติดตั้งใช้งานได้รวดเร็วนั้นไม่ใช่ภาษา ตัวอย่างเช่นคุณไม่สามารถพูดได้ว่า "Python ช้ากว่า Java" โดยไม่พิจารณาว่าคุณกำลังพูดถึง CPython, IronPython หรือ PyPy นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งสำหรับภาษาที่ใช้ VM เนื่องจากความเร็วจะได้รับผลกระทบโดยตรงจากคุณภาพของ VM

นอกจากนี้ฉันทำงานกับระบบที่ด้วยเหตุผลต่าง ๆ ไม่สามารถใช้ JIT บนอุปกรณ์ของเราด้วย JavaScript VM ที่เป็นที่นิยมซึ่งปกติรองรับ ซึ่งหมายความว่า JavaScript ของเราทำงานได้ช้ากว่าที่คิดบนพีซีที่มีโปรเซสเซอร์ที่คล้ายกัน การเปลี่ยนแปลงอย่างหนึ่งซึ่งไม่เกี่ยวข้องโดยตรงกับภาษานั้นทำให้ JavaScript เปลี่ยนจาก "ช้ากว่า C ++ สองเท่า" เป็น "คำสั่งของขนาดช้ากว่า C ++" สำหรับงานที่เราสนใจ

นอกจากนี้ควรพิจารณาว่าภาษาแตกต่างกันในลักษณะของประสิทธิภาพในรูปแบบที่ไม่สามารถเปรียบเทียบได้โดยตรง เกณฑ์มาตรฐานมากเกินไปเพียงแปลโปรแกรมจากภาษา A เป็นภาษา B และไม่คำนึงถึงว่าภาษาแตกต่างกันไปในฟีเจอร์ใดที่รวดเร็ว (คุณสามารถเห็นสิ่งนี้ได้ในการเปรียบเทียบเกณฑ์เปรียบเทียบที่สมเหตุสมผลเช่นที่คุณลิงก์ไปเนื่องจากพวกเขามักจะมีโน้ตเช่น "ขอบคุณมาก ๆ ๆ ๆ ที่แสดงให้ฉันเห็นว่าจะใช้มันอย่างไรในภาษา Foo)

ตัวอย่างเช่นใช้รหัส Java นี้:

for(int i=0;i<10;i++) {
    Object o = new Object;
    doSomething(o);
}

มันจะดึงดูดให้ "เขียน" สิ่งนี้ใน C ++ และเปรียบเทียบเวลาทำงาน:

for(int i=0;i<10;i++) {
    Object *o = new Object;
    doSomething(o);
    delete(o);
}

สิ่งนี้คือโปรแกรมเมอร์ C ++ ที่มีความสามารถทุกคนจะเห็นทันทีว่าใน C ++ นี่ไม่ใช่วิธีที่เร็วที่สุดที่จะทำอะไรบางอย่าง คุณสามารถเร่งความเร็วได้อย่างง่ายดายโดยเปลี่ยนให้เหมาะสมกับ C ++:

for(int i=0;i<10;i++) {
    Object o;
    doSomething(&o);
}

ประเด็นก็คือไม่ใช่ว่า C ++ จะเร็ว แต่แทนที่จะเขียนมาตรฐานเพื่อเปรียบเทียบภาษานั้นยากจริงๆ ในการดำเนินการอย่างเหมาะสมคุณต้องเป็นผู้เชี่ยวชาญทั้งสองภาษาและเขียนตั้งแต่ต้นทั้งสองภาษา ถึงแม้คุณจะสามารถวิ่งเข้าไปในพื้นที่ที่มีภาษาใดงานหนึ่งได้อย่างยอดเยี่ยม ตัวอย่างเช่นฉันสามารถเขียนเวอร์ชันของ Towers of Hanoi ใน C ++ ที่จะทำงานได้เร็วกว่า Java ในคอมไพเลอร์ที่สมเหตุสมผล ฉันสามารถทำได้โดยการโกงโดยใช้เทมเพลต C ++ ประเมินที่เวลาคอมไพล์ (http://forums.devshed.com/c-programming-42/c-towers-of-hanoi-using-templates-424148.html)

ประเด็นก็คือไม่ใช่ว่าฉันจะบอกว่า "C ++ เร็วกว่า Java" เพราะโปรแกรมของฉันกลับมาทันทีในขณะที่รุ่น Java ทำงานนานหลายนาที (และหวังว่าจะไม่มีใครสังเกตเห็นว่าโปรแกรมของฉันใช้เวลาครึ่งชั่วโมงในการสร้าง) ประเด็นก็คือ ตัวพิมพ์เล็กแคบแตกต่างกัน C ++ เร็วกว่า สำหรับกรณีที่แคบอื่น ๆ อาจเป็นวิธีอื่น ดังนั้นมันจึงไม่ใช่ "C ++ เร็วกว่า" แต่ก็เป็น "C ++ เร็วกว่าในกรณีที่คุณสามารถประเมินนิพจน์ ณ เวลาที่สร้างโดยใช้เทมเพลต" พอใจน้อยกว่า แต่จริง

ความแตกต่างของความเร็วในภาษาส่วนใหญ่เกี่ยวกับการใช้งาน ภาษาที่รวบรวมจะเร็วกว่าภาษาที่ตีความ การคอมไพล์โค้ดเนทีฟจะเร็วกว่าการคอมไพล์โค้ดไบต์ สิ่งนี้จะมีผลมากกว่าคำถามเช่นว่าพิมพ์ภาษาแบบคงที่หรือไม่ และแน่นอนว่าการติดตั้งที่ดีนั้นจะเร็วกว่าระบบที่ไม่ดี

และอย่าลืมว่าโปรแกรมเมอร์ที่ดีจะสร้างโค้ดได้เร็วกว่าโปรแกรมเมอร์ที่ไม่ดีบ่อยครั้งที่ค่อนข้างจะมีค่ามากกว่าความแตกต่างของภาษา


6

มันเกี่ยวข้องกับคุณภาพของคอมไพเลอร์คอมไพเลอร์ของจาวาได้รับการปรับให้เหมาะสมอย่างต่อเนื่องเป็นเวลานานและการปรับให้เหมาะสมนั้นสำคัญกว่าเพราะโค้ดทั้งหมดจะถูกคอมไพล์สำหรับจาวา ฉันไม่แน่ใจว่าเหตุผลที่ถูกต้องสำหรับไพ ธ อนที่จะเร็วกว่า PHP แต่ฉันจะวางเดิมพันเพราะอิทธิพลของ Google กับ Python


8
ทำไม downvote นี้ นี่คือตรงคำตอบ: ประสิทธิภาพการทำงานอย่างหมดจดเรื่องของการวิจัยและวิศวกรรมความพยายามและทำให้ในท้ายที่สุดเงิน บริษัท ที่ผลิตการใช้งานจาวานั้นมีความสมบูรณ์มากกว่า บริษัท ที่ผลิตแอพพลิเคชั่น Python หรือ PHP นั่นคือทั้งหมดที่
Jörg W Mittag

1
นอกจากนี้ฉันค่อนข้างมั่นใจว่าการเพิ่มประสิทธิภาพ CPython จะไม่ได้รับการยอมรับหากพวกเขาทำให้โค้ดอ่านยากเกินไปและปรับปรุงประสิทธิภาพเพียงเล็กน้อยเท่านั้น
cgt

2
+ Jörg W Mittag: ฉันไม่เห็นด้วย คุณลักษณะทางภาษาบางอย่างอาจเป็นเรื่องยากมากที่จะนำไปใช้งานอย่างมีประสิทธิภาพดังนั้นจึงทำให้การสร้างการใช้งานที่มีประสิทธิภาพนั้นยากมากหรือถัดจากที่เป็นไปไม่ได้ ในทางตรงกันข้ามมันเป็นเรื่องง่ายเล็กน้อยที่จะสร้างการใช้งาน "ประสิทธิภาพ" ของภาษา "Assembler"
281377

@ammoQ ฉันสงสัยว่ามีหลายอย่างที่มาลงในระบบการพิมพ์และโดยเฉพาะอย่างยิ่งความสามารถในการรู้ว่าคุณมีประเภทใดและความหมายที่แท้จริงของการปฏิบัติการที่อนุญาตคืออะไร ภาษาไดนามิกได้รับความยืดหยุ่นจากธรรมชาติของพวกเขา แต่ทำให้ยากที่จะทำการพิสูจน์ชนิด (และเพื่อรวบรวมรหัสไฮเปอร์อย่างรวดเร็วปลอดภัย)
Donal Fellows

1
@ DonalFellows ความคิดของฉัน ยิ่งรู้จักกันน้อยลงในช่วงเวลาการคอมไพล์มากเท่าไหร่ก็ยิ่งจำเป็นต้องคำนวณในระหว่างรันไทม์
281377

4

ทำไม Java ถึงเร็วที่สุด:

พิมพ์ + JIT คอมไพล์แฟล็ก + --server ที่พิมพ์แบบสแตติกเพื่อเรียกใช้โค้ดที่คอมไพล์ซ้ำอีกครั้ง

ทำไม Python จึงเร็วกว่า PHP:

Python อาจเป็นภาษาไดนามิก แต่ก็ยังคงพิมพ์อย่างรุนแรง ซึ่งหมายความว่าโครงสร้างรหัสของคุณสามารถเพิ่มประสิทธิภาพรันไทม์

ทำไม PHP ดูด:

มันเป็นจาวาสคริปต์บนเซิร์ฟเวอร์ (ไม่มีการสนับสนุนมัลติเธรดแบบไดนามิกทั้งหมดพิมพ์อย่างหลวม ๆ )

โดยพื้นฐานแล้วยิ่งคอมไพเลอร์รู้เกี่ยวกับรหัสของคุณมากเท่าใดก็ยิ่งสามารถเพิ่มประสิทธิภาพได้มากเท่านั้น Java นั้นปรับให้เหมาะสมเต็มที่ก่อนที่จะรันและในขณะที่กำลังรัน Python สามารถปรับแต่งได้ในขณะที่มันกำลังทำงานและ PHP นั้นก็แย่มาก Facebook ทำการ transpiles PHP ไปที่ C จริง ๆ ก่อนที่มันจะเข้าสู่เซิร์ฟเวอร์
https://developers.facebook.com/blog/post/2010/02/02/hiphop-for-php--move-fast/


จริง ๆ แล้วจาวาสคริปต์บนเซิร์ฟเวอร์คือ Node.JS และจากสิ่งที่ฉันเข้าใจ (แม้ว่าฉันจะไม่ยืนยันสิ่งนี้) เครื่องยนต์ V8 มีประสิทธิภาพดีกว่า PHP โดยทั่วไป (แม้ว่าอาจจะไม่ใช่ตัน) นอกจากนี้คุณควรพูดถึง Python สามารถคอมไพล์เป็น native (มันมีประสิทธิภาพอย่างไรเมื่อเทียบกับ Java แล้ว?)
Jimmy Hoffa

ฉันไม่ได้ใช้หลามอย่างกว้างขวางพอที่จะช่วยคุณได้ แต่ฉันสามารถพูดได้ว่า nodejs ที่ใช้ V8 ได้รับการสนับสนุนสำหรับส่วนขยาย C ดั้งเดิม (แม้ว่าการข้ามขอบเขต JS / C นั้นช้าเกินไป) และสามารถใช้ประโยชน์จากคอมไพเลอร์ JIT ของ Google .. ฉันไม่แปลกใจถ้าโหนดนั้นเร็วกว่าทั้งหลามและ php นี่คือเกณฑ์มาตรฐาน (มีข้อบกพร่องมากที่สุด) blog.famzah.net/2010/07/01/… โปรดทราบว่าจาวาดูช้ากว่า JS จนกว่าผู้แสดงความคิดเห็นจะชี้ข้อบกพร่องของเราในเกณฑ์มาตรฐาน ... ดังนั้นให้นำเม็ดของ เกลือ. :)
Ajax

ที่กล่าวว่าโหนดและ php มีทั้งแบบเธรดเดียวและถ้าคุณต้องการตั้งค่าพร็อกซีคลัสเตอร์ (เช่น haproxy) ฉันจะไม่สัมผัสพวกเขาทั้งสองในสภาพแวดล้อมการผลิตที่ร้ายแรง
Ajax

1

มาตรฐานค่อนข้างเบ้แก่โปรแกรมคณิตศาสตร์หนัก

มันไม่น่าแปลกใจว่างูหลามเป็นรักที่ดีที่ทางคณิตศาสตร์ที่ซับซ้อนถ้าคุณพิจารณาที่ไหนและทำไมมันถูกเขียนขึ้นเป็นครั้งแรก

ในทางตรงกันข้าม PHP ถูกเขียนขึ้นเพื่อให้บริการหน้าเว็บมันสามารถทำสิ่งอื่น ๆ ได้ แต่หน้าเว็บเป็นสิ่งที่ดีที่สุดและอยู่ในระดับที่ดีกว่า Java ในงานนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.