ไวยากรณ์และความหมายถูกกำหนดไว้อย่างดีโดยคำตอบที่ยอดเยี่ยมอื่น ๆ สำหรับคำถามนี้ เนื่องจากการดำเนินการและประสิทธิภาพไม่ละเอียดฉันจะเพิ่มคำตอบของฉัน
ความแตกต่างในการทำงานระหว่าง 3 เหล่านี้คืออะไร?
ฉันมักจะถือว่าอะตอมเป็นค่าเริ่มต้นค่อนข้างอยากรู้อยากเห็น ในระดับนามธรรมที่เราทำงานโดยใช้คุณสมบัติอะตอมมิกสำหรับคลาสเป็นยานพาหนะเพื่อให้ได้ความปลอดภัยของด้าย 100% เป็นกรณีมุม สำหรับโปรแกรมแบบมัลติเธรดที่ถูกต้องอย่างแท้จริงการแทรกแซงโดยโปรแกรมเมอร์นั้นเป็นสิ่งจำเป็นอย่างยิ่ง ในขณะเดียวกันคุณลักษณะด้านประสิทธิภาพและการดำเนินการยังไม่ได้รับการอธิบายอย่างละเอียด หลายปีที่ผ่านมาฉันได้เขียนโปรแกรมที่มีหลายเธรดอย่างหนักฉันได้ประกาศคุณสมบัติของฉันnonatomic
ตลอดเวลาเพราะปรมาณูไม่เหมาะสมสำหรับวัตถุประสงค์ใด ๆ ในระหว่างการอภิปรายรายละเอียดของคุณสมบัติอะตอมและไม่ใช่อะตอมคำถามนี้ฉันทำโปรไฟล์บางอย่างพบผลลัพธ์บางอย่างอยากรู้อยากเห็น
การกระทำ
ตกลง. สิ่งแรกที่ฉันต้องการจะล้างคือการนำการล็อกไปใช้กำหนดและการนำไปใช้งาน หลุยส์ใช้@synchronized(self)
ในตัวอย่างของเขา - ฉันได้เห็นสิ่งนี้ว่าเป็นแหล่งของความสับสน การใช้งานจริงไม่ได้ใช้@synchronized(self)
; จะใช้ระดับวัตถุหมุนล็อค ภาพประกอบของหลุยส์เป็นสิ่งที่ดีสำหรับภาพประกอบระดับสูงโดยใช้โครงสร้างที่เราทุกคนคุ้นเคยกับ @synchronized(self)
แต่มันเป็นสิ่งสำคัญที่จะรู้ว่ามันไม่ได้ใช้งาน
ความแตกต่างก็คือคุณสมบัติของอะตอมจะรักษา / ปล่อยวัฏจักรวัตถุของคุณภายในทะเยอทะยาน
ประสิทธิภาพ
นี่คือส่วนที่น่าสนใจ: ประสิทธิภาพการทำงานโดยใช้คุณสมบัติของอะตอมมิกในกรณีที่ไม่มีการโต้แย้ง (เช่นเธรดเดี่ยว) อาจเร็วมากในบางกรณี ในเวลาที่น้อยกว่าเหมาะกรณีใช้เข้าถึงอะตอมสามารถค่าใช้จ่ายมากกว่า 20 nonatomic
ครั้งค่าใช้จ่ายของ ในขณะที่กรณีContested ที่ใช้ 7 เธรดนั้นช้ากว่า 44 เท่าสำหรับโครงสร้างสามไบต์ (2.2 GHz Core i7 Quad Core, x86_64) struct สามไบต์เป็นตัวอย่างของคุณสมบัติช้ามาก
หมายเหตุด้านที่น่าสนใจ: accessors ที่ผู้ใช้กำหนดเองของโครงสร้างสามไบต์เร็วกว่าตัวสังเคราะห์แบบ atomic accessors 52 เท่า; หรือ 84% ความเร็วของการสังเคราะห์ accessor nonatomic
วัตถุในกรณีที่โต้แย้งอาจเกิน 50 ครั้ง
เนื่องจากจำนวนของการปรับให้เหมาะสมและความผันแปรของการนำไปใช้งานจึงค่อนข้างยากที่จะวัดผลกระทบที่เกิดขึ้นจริงในบริบทเหล่านี้ คุณมักจะได้ยินอะไรบางอย่างเช่น "เชื่อใจคุณนอกจากโปรไฟล์และพบว่าเป็นปัญหา" เนื่องจากระดับนามธรรมมันจึงค่อนข้างยากที่จะวัดผลกระทบที่เกิดขึ้นจริง การรวบรวมค่าใช้จ่ายจริงจากโปรไฟล์อาจใช้เวลานานมากและเนื่องจากมีการสรุปที่ไม่ถูกต้อง ARC กับ MRC ก็สามารถสร้างความแตกต่างได้เช่นกัน
ดังนั้นย้อนกลับไปไม่ได้มุ่งเน้นไปที่การใช้งานการเข้าถึงคุณสมบัติเราจะรวมผู้ต้องสงสัยตามปกติobjc_msgSend
และตรวจสอบผลลัพธ์ระดับสูงในโลกแห่งความจริงสำหรับการโทรไปยังผู้เรียกหลายคนNSString
ในกรณีที่ไม่มีการโต้แย้ง (ค่าในไม่กี่วินาที):
- MRC | nonatomic | getters ที่ใช้งานด้วยตนเอง: 2
- MRC | nonatomic | ทะเยอทะยานสังเคราะห์: 7
- MRC | อะตอม ทะเยอทะยานสังเคราะห์: 47
- ARC | nonatomic | synthesized getter: 38 (หมายเหตุ: การนับการอ้างอิงของ ARC เพิ่มที่นี่)
- ARC | อะตอม ทะเยอทะยานสังเคราะห์: 47
ในขณะที่คุณคาดเดากิจกรรมการนับการอ้างอิง / การขี่จักรยานเป็นผู้มีส่วนร่วมสำคัญกับอะตอมมิกและภายใต้ ARC คุณจะเห็นความแตกต่างที่มากขึ้นในกรณีที่ถูกโต้แย้ง
แม้ว่าฉันจะใส่ใจกับการแสดงอย่างมาก แต่ฉันก็ยังพูดถึงความหมายก่อน! . ในขณะเดียวกันประสิทธิภาพมีความสำคัญต่ำสำหรับหลาย ๆ โครงการ อย่างไรก็ตามการรู้รายละเอียดการดำเนินการและค่าใช้จ่ายของเทคโนโลยีที่คุณใช้อย่างแน่นอนไม่ได้ทำให้เจ็บปวด คุณควรใช้เทคโนโลยีที่เหมาะสมกับความต้องการวัตถุประสงค์และความสามารถของคุณ หวังว่านี่จะช่วยให้คุณประหยัดเวลาในการเปรียบเทียบสองสามชั่วโมงและช่วยให้คุณตัดสินใจได้ดีขึ้นเมื่อออกแบบโปรแกรมของคุณ