มีเหตุผลที่ดีในการใช้งานซอฟต์แวร์ 32 บิตแทนที่จะเป็น 64 บิตบนเครื่อง 64 บิตหรือไม่?


56

มีเหตุผลที่ดีในการจัดหาเวอร์ชั่น 32 บิตพร้อมกับซอฟต์แวร์ 64- บิตรุ่นใดที่มีเป้าหมายที่เครื่องเดสก์ท็อปสมัยใหม่เรียกใช้ระบบปฏิบัติการ 64- ​​บิตสมัยใหม่บนฮาร์ดแวร์ 64 บิตหรือไม่?

ดูเหมือนว่าซอฟต์แวร์ 64 บิตจะมีประสิทธิภาพมากขึ้นอนุญาตให้ใช้หน่วยความจำได้สูงขึ้นหากจำเป็น ฯลฯ Apple ยังใช้โปรเซสเซอร์ 64- บิตสำหรับโทรศัพท์แม้ว่าจะมี RAM เพียง 1-2 GB หรือต่ำกว่า 4 GB จำกัด สำหรับ CPU แบบ 32 บิต


16
ไม่ใช่เครื่องที่ทันสมัยทุกรุ่นที่ใช้ระบบปฏิบัติการ 64 บิต
Bálint

4
คุณมีตัวอย่างหรือไม่?
Filip Haglund

8
ถามลูกค้าของคุณ
เมอร์ฟี

22
คำถามเชิงโวหาร: มีเหตุผลที่จะจัดหาซอฟต์แวร์ 64 บิตใด ๆ เนื่องจากระบบปฏิบัติการ 64 บิตที่ทันสมัยส่วนใหญ่อนุญาตให้เรียกใช้แอปพลิเคชัน 32 บิตและ 64 บิตได้หรือไม่?
Doc Brown

2
ไม่ใช่ @gnat ที่ซ้ำกัน คำถามนั้นเกี่ยวกับการปรับการประทับเวลาและรหัสผู้พัฒนาในรหัสข้อผิดพลาดที่ส่งคืนเมื่อโปรแกรมออก
Filip Haglund

คำตอบ:


80

ประโยชน์ของซอฟต์แวร์ 32 บิตในสภาพแวดล้อม 64 บิต

  • ลดขนาดหน่วยความจำโดยเฉพาะอย่างยิ่งในแอพพลิเคชั่นที่มีตัวชี้หนัก 64- บิตเทียบกับ 32- บิตสามารถเพิ่มความต้องการหน่วยความจำได้สองเท่า
  • ไฟล์วัตถุก็เล็กลงเช่นกัน
  • เข้ากันได้กับสภาพแวดล้อมแบบ 32 บิต
  • การรั่วไหลของหน่วยความจำถูกต่อยอดอย่างหนักเป็น 2 GB, 3 GB หรือ 4 GB และจะไม่ทำให้ระบบทั้งหมดเสียหาย

ข้อเสียของซอฟต์แวร์ 32 บิตในสภาพแวดล้อม 64 บิต

  • 2 GB, 3 GB หรือขีด จำกัด หน่วยความจำ 4 GB ต่อกระบวนการ (เพียงแค่ต่อกระบวนการรวม 32- บิตกระบวนการรวมอาจใช้หน่วยความจำระบบที่มีอยู่เต็ม)
  • ไม่ใช้การลงทะเบียนเพิ่มเติมและส่วนขยายชุดคำสั่งขึ้นอยู่กับ x64 นี่เป็นคอมไพเลอร์และซีพียูที่เฉพาะเจาะจง
  • อาจต้องใช้ไลบรารี (ส่วนใหญ่ที่เป็นลีนุกซ์ส่วนใหญ่) รุ่น 32 บิตหรือผิดปกติ (เวอร์ชั่น Windows ส่วนใหญ่) และสภาพแวดล้อมแบบรันไทม์ หากมีการโหลดไลบรารีที่ใช้ร่วมกันรุ่น 32 บิตสำหรับแอปพลิเคชันของคุณโดยเฉพาะ ไม่มีความแตกต่างเลยถ้าคุณเชื่อมโยงแบบคงที่

ด้านอื่น ๆ

  • ไดรเวอร์มักจะไม่เป็นปัญหา เฉพาะไลบรารีพื้นที่ผู้ใช้ควรแตกต่างกันระหว่าง 32- บิตและ 64- บิตไม่ใช่ API ของโมดูลเคอร์เนล
  • ระวังความกว้างเริ่มต้นที่แตกต่างกันสำหรับประเภทข้อมูลจำนวนเต็มจำเป็นต้องมีการทดสอบเพิ่มเติม
  • สถาปัตยกรรม CPU 64 บิตอาจไม่รองรับแม้แต่ 32 บิตเลย
  • เทคนิคบางอย่างเช่นASLRและอื่น ๆ ขึ้นอยู่กับพื้นที่ที่อยู่ที่ใหญ่กว่าหน่วยความจำกายภาพจะทำงานได้ไม่ดี (หรือเลย) ในโหมดการประมวลผลแบบ 32 บิต

เว้นแต่จะเปรียบเทียบสถาปัตยกรรม CPU ที่เฉพาะเจาะจงมาก ๆ ระบบปฏิบัติการและโครงสร้างพื้นฐานของไลบรารีที่นี่ฉันจะไม่สามารถดูรายละเอียดเพิ่มเติมได้


8
"สถาปัตยกรรม CPU 64 บิตอาจไม่รองรับ 32 บิตเลย" นี่เป็นความกังวลทางทฤษฎีมากกว่านี้หรือมีอยู่จริงในโลกนี้หรือไม่?
mucaho

10
@mucaho แน่นอนมีซีพียูสถาปัตยกรรม 64 บิตเท่านั้นเช่นอัลฟ่าและ IA64 แม้ว่าทั้งสองอย่างนั้นจะไม่ตาย ฉันไม่รู้ด้านบนของหัวของฉันว่ามีสถาปัตยกรรม 64- บิตเท่านั้นที่ผลิตในปัจจุบัน - AArch64 หรือไม่? ไม่มีใครรู้ว่า ARM 32 บิตเป็นส่วนประกอบที่จำเป็นหรือไม่?
zwol

10
@zwol ไม่ 32- บิตนั้นไม่จำเป็นสำหรับ ARM และไม่ใช่ 64- บิต มี ARM CPU เท่านั้น 64 บิตขณะที่บางรุ่นรองรับกระบวนการ 32- บิตและ 64- บิต
Ext3h

3
มีประโยชน์เพิ่มเติมเพียงแค่เลือกสถาปัตยกรรมเดียวและยึดติดกับมันคือการพัฒนาและทดสอบที่ง่ายขึ้น
jl6

7
@Joshua มีอยู่เสมอหรือไม่ ฟาโรห์รู้เรื่องนี้ไหม
candied_orange

7

ความแตกต่างระหว่างซอฟต์แวร์ 32 บิตและซอฟต์แวร์ 64 บิตคือขนาดของพอยน์เตอร์และขนาดของเรจิสเตอร์จำนวนเต็ม แค่นั้นแหละ.

นั่นหมายความว่าพอยน์เตอร์ทั้งหมดในโปรแกรมของคุณมีขนาดใหญ่เป็นสองเท่า และ (อย่างน้อยก็ในสถาปัตยกรรม ILP32 / LP64) ขนาดของคุณlongก็ใหญ่เป็นสองเท่าเช่นกัน โดยทั่วไปแล้วจะเพิ่มขนาดรหัสวัตถุประมาณ 30% ซึ่งหมายความว่า ...

  • รหัสวัตถุของคุณจะใช้เวลานานขึ้น ~ 30% ในการโหลดจากดิสก์ไปยัง RAM
  • รหัสวัตถุของคุณจะใช้พื้นที่ในหน่วยความจำเพิ่มขึ้น ~ 30%
  • คุณได้ลดแบนด์วิดธ์หน่วยความจำของคุณ (สำหรับรหัสวัตถุ) ได้อย่างมีประสิทธิภาพลดลง ~ 20%
  • คุณลดขนาดของแคชคำสั่งลงอย่างมีประสิทธิภาพ ~ 20%

สิ่งนี้มีผลกระทบด้านลบต่อประสิทธิภาพ

การทำเช่นนี้เหมาะสมถ้าคุณสามารถ "ซื้อคืน" ประสิทธิภาพการทำงานเหล่านั้นมีค่าใช้จ่ายอย่างใด โดยทั่วไปมีสองวิธีในการทำเช่นนี้: คุณทำคณิตศาสตร์จำนวนเต็ม 64 บิตหรือคุณต้องการหน่วยความจำที่แมปของ GiByte มากกว่า 4 หากหนึ่งหรือทั้งคู่เป็นจริงมันสมเหตุสมผลที่จะใช้ซอฟต์แวร์ 64 บิตมิฉะนั้นจะไม่มี

หมายเหตุ: มีบางสถาปัตยกรรมที่ไม่มีตัวแปร 32 หรือ 64 บิตที่สอดคล้องกัน ในกรณีนั้นคำถามชัดเจนไม่สมเหตุสมผล รู้จักกันดีที่สุดคือ IA64 ซึ่งเป็นเพียง 64 บิตและไม่มีตัวแปร 32 บิตและ x86 / AMD64 ซึ่งแม้ว่าจะเกี่ยวข้องอย่างใกล้ชิดสถาปัตยกรรมที่แตกต่างกัน x86 เป็น 32 บิตเท่านั้น AMD64 เป็น 64 บิตเท่านั้น

จริงๆแล้วคำสั่งหลังนั้นไม่เป็นความจริง 100% อีกต่อไป Linux เพิ่งเพิ่ม x32 ABI ซึ่งอนุญาตให้คุณเรียกใช้รหัส AMD64 ที่มีตัวชี้ 32 บิตดังนั้นแม้ว่ามันจะไม่ใช่สถาปัตยกรรมของ CPU ที่ "เหมาะสม" แต่ก็เป็นวิธีการใช้สถาปัตยกรรม AMD64 ในแบบที่เหมือนกับว่ามันเป็นเจ้าของภาษา ชุดตัวแปร 32 บิต สิ่งนี้ทำอย่างแม่นยำเพราะค่าใช้จ่ายด้านประสิทธิภาพที่ฉันกล่าวถึงข้างต้นก่อให้เกิดปัญหาที่วัดได้จริงและเชิงปริมาณสำหรับผู้ใช้โลกแห่งความจริงที่ใช้รหัสโลกแห่งความจริงในระบบโลกแห่งความจริง


8
สิ่งที่เกี่ยวกับการลงทะเบียนและคำแนะนำพิเศษใน amd64 เมื่อเทียบกับ x86 มันช่วยเพิ่มประสิทธิภาพได้มากแค่ไหน?
Filip Haglund

2
Google สำหรับ "ตัวชี้แท็ก" ที่ใช้ใน Objective-C บน MacOS X และ iOS วัตถุจำนวนมากมีหน่วยความจำไม่มาก แต่วัตถุทั้งหมดถูกปลอมแปลงภายในตัวชี้บนระบบ 64 บิต (ฉันได้ยินว่า Java ทำสิ่งที่คล้ายกัน) ใน C ++ สตริง std :: บน 64 บิตมักประกอบด้วยอักขระสูงสุด 22 ตัวในวัตถุโดยไม่มีการจัดสรรหน่วยความจำใด ๆ การประหยัดหน่วยความจำที่สำคัญและการปรับปรุงความเร็ว
gnasher729

3
ขนาดพอยน์เตอร์และจำนวนเต็มเป็นเท่าไหร่? สิ่งที่เกี่ยวกับพื้นที่ที่อยู่ที่มีขนาดใหญ่ขึ้นและการลงทะเบียนเพิ่มเติมในสถาปัตยกรรม 64 บิตส่วนใหญ่

1
"คุณ [ลด] คำสั่งแคชลดลง ~ 20%"เป็นสิ่งที่สงสัยเนื่องจากชุดคำสั่งนั้นแตกต่างอย่างสิ้นเชิง(และมักจะมีประสิทธิภาพมากกว่า)
BlueRaja - Danny Pflughoeft

3
"นี้มีไม่น้อยผลกระทบต่อประสิทธิภาพการทำงาน." แม้ว่าข้อความนี้จะเป็นความจริง แต่ก็ไม่สนใจความจริงที่ว่าคอขวดของแอพพลิเคชั่นส่วนใหญ่ไม่ได้อยู่ในเวลาโหลดหรือการใช้งานหน่วยความจำ / แบนด์วิดธ์หรือจำนวนคำสั่งในแคช
Ian Kemp

6

หากซอฟต์แวร์ต้องการเชื่อมต่อโดยตรงกับระบบเดิมไดรเวอร์หรือไลบรารีคุณอาจต้องจัดหารุ่น 32 บิตเนื่องจาก AFAIK ระบบปฏิบัติการโดยทั่วไป (แน่นอนว่า Windows และ Linux AFAIK) ไม่อนุญาตให้ใช้การรวม 64 บิตและ 32 - รหัสบิตในกระบวนการ

ตัวอย่างเช่นหากซอฟต์แวร์ของคุณต้องการเข้าถึงฮาร์ดแวร์พิเศษไม่ใช่เรื่องแปลกที่ลูกค้าจะใช้รุ่นเก่าซึ่งมีไดรเวอร์ 32- บิตเท่านั้น


2
คุณสามารถผสม 32 บิตและ 64 บิตในกระบวนการเดียวกันทั้งใน Windows และ Linux: stackoverflow.com/q/12716419/703382
Navin

1
@Navin: แต่มันใช้ได้จริงไหม? คุณสามารถใช้องค์ประกอบ COMในแอปพลิเคชัน Windows แบบ 64 บิตได้หรือไม่ (เช่นแอปพลิเคชัน. NET ที่ทำเครื่องหมายเป็นCPU ใด ๆ ที่ทำงานบน Windows เวอร์ชั่น 64 บิต)
Peter Mortensen

3

หากซอฟต์แวร์ของคุณเป็น DLL คุณต้องระบุทั้งรุ่น 32 บิตและ 64 บิต คุณไม่มีความคิดว่าลูกค้าจะใช้ซอฟต์แวร์ 32- บิตหรือ 64- บิตเพื่อพูดคุยกับ DLL และ DLL นั้นต้องใช้ความยาวบิตเดียวกันกับแอปพลิเคชัน สิ่งนี้ไม่สามารถต่อรองได้

หากซอฟต์แวร์ของคุณใช้งานได้แบบสแตนด์อโลนแสดงว่าไม่ชัดเจน หากคุณไม่ต้องการให้ซอฟต์แวร์ของคุณทำงานบนระบบปฏิบัติการรุ่นเก่าคุณอาจไม่จำเป็นต้องจัดเตรียมรุ่น 32 บิต เพียงติดกับ 64- บิตระบุว่ามันต้องใช้ระบบปฏิบัติการ 64 บิตและงานทำ

อย่างไรก็ตามหากคุณต้องการซอฟต์แวร์ของคุณเพื่อใช้งานบนระบบปฏิบัติการรุ่นเก่าคุณอาจไม่ต้องการให้เป็นรุ่น 64 บิต หากคุณมีสองรุ่นคุณจะต้องเพิ่มการทดสอบเป็นสองเท่าและการทดสอบซอฟต์แวร์ที่เหมาะสมในช่วงของระบบปฏิบัติการและภาษาต่าง ๆ นั้นไม่ใช่กระบวนการที่รวดเร็ว เนื่องจากซอฟต์แวร์ 32 บิตทำงานอย่างมีความสุขอย่างสมบูรณ์แบบบนแพลตฟอร์ม 64 บิตจึงยังคงค่อนข้างธรรมดาสำหรับซอฟต์แวร์ที่จะเปิดตัวเป็น 32 บิตเท่านั้นโดยเฉพาะอย่างยิ่งนักพัฒนาขนาดเล็ก

โปรดทราบว่าโทรศัพท์มือถือส่วนใหญ่มีขนาด 32 บิต บางทีคนระดับไฮเอนด์บางคนอาจเป็น 64- บิตในตอนนี้ แต่มีเหตุผลเล็กน้อยที่น่าสนใจในการทำขั้นตอนนั้น ดังนั้นหากคุณกำลังพัฒนาข้ามแพลตฟอร์มและอาจต้องการให้โค้ดของคุณทำงานบน Android เช่นกันการพัก 32 บิตเป็นตัวเลือกที่ปลอดภัย


ฉันจะโต้แย้งกับตำแหน่งของคุณในการทดสอบที่ลดลง ฉันขอยืนยันที่จะทดสอบบนหลาย ๆ แพลตฟอร์มโดยเฉพาะอย่างยิ่งไม่เพียง แต่ขนาดการลงทะเบียนที่แตกต่างกัน แต่ด้วยการสั่งซื้อไบต์ที่แตกต่างกันเป็นวิธีง่ายๆในการเพิ่มการทดสอบและตรวจจับข้อผิดพลาดเล็กน้อย นอกจากนี้ฉันจะทำการทดสอบบนคอมพิวเตอร์ที่ไม่ตรงตามข้อกำหนดขั้นต่ำของฮาร์ดแวร์ที่คุณแนะนำเพราะจะทำให้เกิดปัญหาเพิ่มเติมที่อาจไม่แสดงเป็นอย่างอื่นนอกจากชุดข้อมูลขนาดใหญ่มาก
hildred

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

1
ไม่ฟรี แต่ราคาถูกอย่างจริงจัง หากคุณ จำกัด การทดสอบแพลตฟอร์มนอกการทดสอบอัตโนมัติการทดสอบไอเดียมเป็นครั้งคราวฮาร์ดแวร์ที่ใช้นอกเหนือจากการตั้งค่าของคุณสำหรับการทดสอบที่ประสบความสำเร็จหลังจากการตั้งค่าเริ่มต้นของคุณจะถูก จำกัด การใช้พลังงานและประมาณ 7 นาทีต่อการทดสอบ ค่าใช้จ่ายสำหรับการทดสอบที่ล้มเหลวนั้นแน่นอนว่าจะสูงกว่า แต่โดยทั่วไปแล้วการทดสอบเหล่านั้นจะคุ้มค่ามากกว่า การตั้งค่าประเภทนี้มีประโยชน์อย่างยิ่งสำหรับโปรแกรมเมอร์ c เนื่องจากจะทำให้เกิดปัญหาระดับพอยน์เตอร์ที่ยากต่อการติดตาม
hildred
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.