Xcode 6 พร้อมด้วย Swift super slow tyre และ autocompletion


115

เป็นเพียงฉันหรือ Xcode 6 (6.0.1) กับ Swift ดูเหมือนว่าจะช้ามากเมื่อคุณพิมพ์รหัสโดยเฉพาะอย่างยิ่งกับการเติมข้อความอัตโนมัติ

คลาส Objective-C ปกติแม้ว่าจะอยู่ในโปรเจ็กต์ Swift แต่ก็ทำงานได้เกือบเหมือนเดิมดังนั้น Swift จึงฆ่ามัน

มีใครเจอความไม่สะดวกแบบเดียวกันบ้างไหม? คุณมีความคิดในการปรับปรุงประสิทธิภาพหรือไม่?

  • ฉันพยายามเล่นกับการตั้งค่าบางอย่าง แต่โชคไม่ดี
  • แน่นอนฉันได้ลองรีสตาร์ท Xcode และคอมพิวเตอร์โดยไม่มีโชค
  • ไม่มีแอปอื่น ๆ เปิดอยู่

ฉันใช้ Macbook Pro กลางปี ​​2009 (2.26 GHz Intel Core 2 Duo) ที่มี RAM 8GB และ SSD HD ซึ่งไม่ใช่สิ่งใหม่ล่าสุดเลย แต่ก็ยังไม่เป็นขยะสมบูรณ์

เป็นเรื่องน่าเสียดายที่ฉันรู้สึกตื่นเต้นที่ได้เริ่มใช้ Swift และตอนนี้ก็ทนไม่ได้จริงๆ

ความคิด / เคล็ดลับ?


1
ฉันมีปัญหาเดียวกับคุณ บ่อยครั้งที่ Xcode บอกฉันว่า "SourceKit ถูกยกเลิกตัวแก้ไข จำกัด ชั่วคราว"
idmean

ใช่นี่เป็นอีกปัญหาหนึ่งฉันไม่แน่ใจว่ามันเกี่ยวข้องกัน มันช้าแม้ว่าจะเกิดข้อผิดพลาด
mllm

1
ฉันแน่ใจว่าเกี่ยวข้องกัน ในเบต้า 5 ฉันเห็นข้อความนั้นบ่อยขึ้นและฉันเห็นว่าเมื่อใดก็ตามที่คำแนะนำไม่ได้ผล (เมื่อฉันพิมพ์ตัวอักษรบางตัวและกด Esc เพื่อเรียกใช้คำแนะนำ)
idmean

1
ผมมีปัญหาเดียวกัน. XCode ของฉันใช้ซีพียู 300% ขึ้นไปและทำให้ macbook retina ของฉันช้าลงจนเหลือแค่ความเร็วหอยทาก วันนี้ฉันพิมพ์สุ่มสี่สุ่มห้าและรอให้ xcode เสร็จสมบูรณ์
pkuhar

1
มีปัญหาเดียวกันกับ MacBook Pro รุ่น 15.6 นิ้วรุ่นปลายปี 2011 ที่มี RAM 8 GB และ SSD 90% ของรหัสเวลาที่เสร็จสมบูรณ์จะหยุด Xcode เมื่อฉันตรวจสอบตัวตรวจสอบกิจกรรมฉันเห็นการใช้งาน CPU ~ 200% การหยุดทำงานล่าสุดจากสองสามวินาที อีกไม่กี่นาที
isair

คำตอบ:


86
  • ไม่จำเป็นต้องออกจาก Xcode และรีสตาร์ท Mac แต่ขอแนะนำ
  • ลบเนื้อหาของโฟลเดอร์ ~ / Library / Developer / Xcode / DerivedData
  • ลบเนื้อหา ~ / Library / Caches / com.apple.dt.Xcode

นี่เป็นวิธีแก้ปัญหาชั่วคราว แต่ใช้ได้ผลดี

ด้านล่างสคริปต์โดยใช้แอพ Script Editor

tell application "Terminal"
    do script "rm -frd ~/Library/Developer/Xcode/DerivedData/*"
    do script "rm -frd ~/Library/Caches/com.apple.dt.Xcode/*"
end tell

หรือคุณสามารถสร้างนามแฝงสำหรับเทอร์มินัลของคุณได้ดังนี้:

alias xcodeclean="rm -frd ~/Library/Developer/Xcode/DerivedData/* && rm -frd ~/Library/Caches/com.apple.dt.Xcode/*"

คุณสามารถเพิ่มลงในไฟล์ ~/.bash_profileแล้วพิมพ์xcodecleanในบรรทัดคำสั่งทุกครั้งที่คุณต้องการจะล้างทั้งสองโฟลเดอร์


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

แล็ปท็อปของฉันใช้เวลาเกือบนาทีในการลบเนื้อหาทั้งหมดจากสองโฟลเดอร์นั้น การสร้างดัชนีบน Xcode ใช้เวลาไม่เกิน 30 วินาที
Eneko Alonso

มันไม่ได้ทำให้การพิมพ์และการเติมข้อความอัตโนมัติของฉันเร็วขึ้น แต่มันช่วยให้ฉันมีพื้นที่ว่างค่อนข้างมากจาก Mac ของฉัน
Scott Zhu

คำตอบนี้ช่วยในเรื่องการเติมข้อความอัตโนมัติstackoverflow.com/a/29849869/1213267
Scott Zhu

13

ฉันยังพบว่ามี CPU + 100% ในขณะที่พิมพ์โค้ด "แบบธรรมดา" เทคนิคเล็ก ๆ น้อย ๆ ที่จะทำให้ตัวแยกวิเคราะห์รวดเร็วเร็วขึ้นด้วยวิธีที่คุณจัดโครงสร้างโค้ดของคุณ

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

แทน:

var str = "This" + String(myArray.count) + " is " + String(someVar)

ใช้เทมเพลต - ไวยากรณ์ซึ่งดูเหมือนจะมีประสิทธิภาพมากกว่าในการแยกวิเคราะห์อย่างรวดเร็ว:

var str = "This \(myArray.count) is \(someVar)"

ด้วยวิธีนี้โดยทั่วไปฉันสังเกตเห็นว่าไม่มีขีด จำกัด ใน strlen ด้วย vars แบบอินไลน์ "\ (*)"

หากคุณมีการคำนวณซึ่งใช้ + / * - ให้แบ่งออกเป็นส่วนย่อย ๆ

แทน:

var result = pi * 2 * radius 

ใช้:

var result  = pi * 2
    result *= radius

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

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

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

วิธีนี้ทำให้ฉันได้รับจาก 100% ในการกดแต่ละครั้งไปจนถึง CPU ต่ำขณะพิมพ์ ตัวอย่างเช่น 3 บรรทัดนี้ใส่อินไลน์ในเนื้อความฟังก์ชันของคุณสามารถนำ swiftparser ไปสู่การรวบรวมข้อมูล

let fullPath =  "\(NSHomeDirectory())/Library/Preferences/com.apple.spaces.plist"
let spacesData  = NSDictionary(contentsOfFile: fullPath )! // as Dictionary<String, AnyObject>
let spaces : AnyObject   = spacesData["SpacesDisplayConfiguration"]!["Management Data"]!!["Monitors"]!![0]["Spaces"]!! 

println ( spaces )

แต่ถ้าฉันใส่ไว้ใน func แล้วเรียกมันในภายหลัง swiftparser จะเร็วกว่ามาก

// some crazy typecasting here to silence the parser
// Autodetect of Type from Plist is very rudimentary, 
// so you have to teach swift your types
// i hope this will get improved in swift in future
// would be much easier if one had a xpath filter with
// spacesData.getxpath( "SpacesDisplayConfiguration/Management Data/Monitors/0/Spaces" ) as Array<*> 
// and xcode could detect type from the plist automatically
// maybe somebody can show me a more efficient way to do it
// again to make it nice for the swift parser, many vars and small statements
func getSpacesDataFromPlist() -> Array<Dictionary<String, AnyObject>> {
  let fullPath =  "\(NSHomeDirectory())/Library/Preferences/com.apple.spaces.plist"

  let spacesData  = NSDictionary(contentsOfFile: fullPath )!    as Dictionary<String, AnyObject>
  let sdconfig    = spacesData["SpacesDisplayConfiguration"]    as Dictionary<String, AnyObject>
  let mandata     = sdconfig["Management Data"]                 as Dictionary<String, AnyObject> 
  let monitors    = mandata["Monitors"]                         as Array<Dictionary<String, AnyObject>> 
  let monitor     = monitors[0]                                 as Dictionary<String, AnyObject>
  let spaces      = monitor["Spaces"]                           as Array<Dictionary<String, AnyObject>>

  return spaces
}

func awakeFromNib() {
  ....
  ... typing here ...

  let spaces = self.getSpacesDataFromPlist()
  println( spaces) 
}

Swift และ XCode 6.1 ยังคงมีข้อบกพร่องอยู่มาก แต่ถ้าคุณทำตามเทคนิคง่ายๆเหล่านี้การแก้ไขโค้ดจะเป็นที่ยอมรับอีกครั้ง ฉันชอบที่รวดเร็วมากเพราะมันกำจัดไฟล์. h และใช้ไวยากรณ์ที่สะอาดกว่ามาก ยังคงมีความจำเป็นในการคัดเลือกนักแสดงหลายประเภทเช่น "myVar เป็น AnyObject" แต่นั่นเป็นความชั่วร้ายที่เล็กกว่าเมื่อเทียบกับโครงสร้างและไวยากรณ์ของโครงการ Object-c ที่ซับซ้อน

นอกจากนี้ประสบการณ์อื่นฉันลอง SpriteKit ซึ่งใช้งานได้สนุก แต่ค่อนข้างมีประสิทธิภาพหากคุณไม่ต้องการทาสีใหม่ที่ 60fps อย่างต่อเนื่อง การใช้ CALayers แบบเก่าจะดีกว่าสำหรับ CPU มากหาก "สไปรต์" ของคุณไม่ได้เปลี่ยนบ่อยขนาดนั้น หากคุณไม่เปลี่ยน. เนื้อหาของเลเยอร์โดยทั่วไปแล้ว CPU จะไม่ได้ใช้งาน แต่ถ้าคุณมีแอป SpriteKit ที่ทำงานอยู่เบื้องหลังการเล่นวิดีโอในแอปอื่น ๆ อาจเริ่มกระตุกเนื่องจากลูปการอัปเดต 60fps ที่ จำกัด ยาก

บางครั้ง xcode แสดงข้อผิดพลาดแปลก ๆ ในขณะคอมไพล์จากนั้นจะช่วยไปที่เมนู "ผลิตภัณฑ์> ทำความสะอาด" และรวบรวมอีกครั้งดูเหมือนว่าจะเป็นการใช้แคชที่มีข้อบกพร่อง

อีกวิธีที่ดีในการปรับปรุงการแยกเมื่อ Xcode ได้รับการติดอยู่กับรหัสของคุณเป็นที่กล่าวถึงในโพสต์ StackOverflow อีกที่นี่ โดยทั่วไปคุณคัดลอกเนื้อหาทั้งหมดจากไฟล์. swift ของคุณไปยังโปรแกรมแก้ไขภายนอกจากนั้นทำงานโดยฟังก์ชันคัดลอกกลับมาและดูว่าคอขวดของคุณอยู่ที่ใด สิ่งนี้ช่วยให้ฉันได้รับ xcode ด้วยความเร็วที่สมเหตุสมผลอีกครั้งหลังจากที่โครงการของฉันคลั่งไคล้ CPU 100% ในขณะที่คัดลอกโค้ดของคุณกลับคุณสามารถ refactor และพยายามทำให้ function-body ของคุณสั้นและ function / formulars / expression เรียบง่าย (หรือแบ่งเป็นหลายบรรทัด)


คำตอบอย่างละเอียดมาก บางทีคำแนะนำบางอย่างอาจดีในฐานะ "การปฐมพยาบาล" แต่จริงๆแล้วเราไม่คาดหวังว่า Xcode จะทำงานได้โดยไม่ต้องยุ่งยากมากหรือ?
mllm

1
น่าเสียดายที่ xcode 6.1 + swift ค่อนข้างไม่เสถียรดังนั้นจึงจำเป็นต้องมี "แฮ็ก" เหล่านี้ Apple ควรแก้ไข swift และ xcode แต่ swift เป็นโปรแกรมที่ดีมากดังนั้นในระยะสั้นนี่เป็นวิธีเดียวที่จะทำให้การใช้งาน CPU ไม่เป็นระเบียบ
Daniel Unterberger

ฉันทำการเปลี่ยนแปลงที่เป็นไปได้ทั้งหมดตามที่คุณเสนอ แต่น่าเสียดายที่การเติมข้อความอัตโนมัติของฉันยังคงแย่อยู่ฉันสงสัยว่าการชวเลขหากอนุประโยคอาจสร้างปัญหาได้เช่นกันใครสามารถรับทราบได้บ้าง ฉันหมายถึงผลตอบแทน (a == b)? x: y
Ilker Baltaci

การเขียนโค้ดด้วยวิธีใดวิธีหนึ่งเพื่อให้ IDE มีความสุขนั้นเป็นเรื่องไร้สาระอย่างแท้จริง
Andrey Gordeev

10

การเติมข้อความอัตโนมัติเสียตั้งแต่ Xcode 4. จนกระทั่งแอปเปิ้ลตัดสินใจที่จะแก้ไขปัญหานี้ข้อผิดพลาดอายุ 2 ขวบทางออกเดียวที่โชคร้ายคือการเปิดรหัสเสร็จOFFกับการตั้งค่าของ XCode (ตัวเลือกแรกของรูปด้านล่าง)

คุณสามารถสนุกกับการดำเนินการต่อได้ด้วยตนเองโดยพิมพ์CTRL spaceหรือESCเมื่อคุณต้องการ

นี่เป็นทางออกเดียวที่ใช้ได้ผล 100% ทุกกรณี

ใส่คำอธิบายภาพที่นี่

อีกสิ่งหนึ่งที่ฉันค้นพบเมื่อเร็ว ๆ นี้คือ: หากคุณใช้ปลั๊กอินบน Xcode อย่าทำ ลบออกทั้งหมด พวกเขาทำให้ปัญหาแย่ลง


5

คุณใช้ Spotify หรือไม่? ฉันติดตั้ง Yosemite GM ด้วย Xcode 6.1 GM บน iMac กลางปี ​​2009 (2.66Ghz) ที่มีปัญหาเดียวกันฉันพบว่ากระบวนการที่เรียกว่า "SpotifyWebHelper" จะถูกทำเครื่องหมายเป็นสีแดงเสมอว่าไม่ตอบสนองดังนั้นฉันจึงปิดใช้งานตัวเลือก "เริ่มจากเว็บ" ใน spotify และตอนนี้ Xcode ดูเหมือนจะทำงานได้ดีขึ้นมาก


น่าสนใจ แต่สำหรับฉันแล้วมันไม่เกี่ยวข้องกับ Spotify ... อย่างไรก็ตามมันแสดงให้เห็นว่าอาจเป็นเพียงปัญหาด้านประสิทธิภาพ "ปกติ" - หมายถึง - ล้างทรัพยากรให้มากขึ้นและจะทำงานได้ดีขึ้น เป็นเรื่องน่าเศร้าที่ฉันไม่มีทรัพยากรให้อีกต่อไป (นอกเหนือจากเงินใน Mac เครื่องใหม่)
mllm

2

ฉันพบว่ามักเกิดขึ้นเมื่อคุณ:

  • มีนิพจน์ยาวในคำสั่งเดียว (ดูคำตอบนี้ )
  • ผสมตัวดำเนินการแบบกำหนดเองหลายตัวในนิพจน์เดียว

กรณีที่ 2 ดูเหมือนว่าจะได้รับการแก้ไขในการเผยแพร่ xcode ล่าสุด ตัวอย่าง: ฉันกำหนดตัวดำเนินการที่กำหนดเอง 2 ตัว <&&> และ <||> และใช้ในนิพจน์เช่นa <&&> b <&&> c <||> d. การแยกเป็นหลายบรรทัดช่วยแก้ปัญหาได้:

let r1 = a <&&> b
let r2 = r1 <&&> c
let r3 = r2 <||> d

ฉันหวังว่ากรณีของคุณจะครอบคลุมโดยหนึ่งใน 2 ข้อข้างต้น ... โปรดโพสต์ความคิดเห็นทั้งสองกรณี


5
น่าเสียดายที่มันเกิดขึ้นในโปรเจ็กต์ใหม่เอี่ยมที่ไม่มีอะไรอยู่ในนั้นและด้วยการพิมพ์อะไรง่ายๆอย่าง "var s: Stri ... " ทันทีที่ฉันเริ่มพิมพ์ St ... มันจะอืดเมื่อค้นหาคำแนะนำที่สมบูรณ์
mllm

มันเป็นตัวดำเนินการสำหรับฉันอย่างแน่นอน การมีตัวถูกดำเนินการมากกว่าหนึ่งตัวในบรรทัดเดียวกันทำให้เกิด ขอบคุณสำหรับคำตอบ. นี่น่าจะเป็นคำตอบที่ถูกต้อง
Kesava

2

ฉันมีปัญหาเดียวกันแม้ใน Xcode 6.3

  • การเติมข้อความอัตโนมัติที่ช้ามาก
  • การจัดทำดัชนีที่ช้ามาก
  • การใช้งาน CPU มหาศาลโดยรวดเร็วและ SourceKitService
  • การใช้หน่วยความจำมหาศาลโดย SourceKitService

ทั้งหมดนี้เกิดขึ้นแม้ในโครงการที่ค่อนข้างเล็ก ฉันลองแก้ไขทั้งหมดที่พบ:

  • การลบ ~ / Library / Developer / Xcode / DerivedData / *
  • การลบ ~ / Library / Caches / com.apple.dt.Xcode / *
  • ลบสตริง "+" ทั้งหมดออกจากโค้ด
  • ลบการประกาศพจนานุกรมที่น่าสงสัยทั้งหมด

สิ่งเหล่านี้ไม่มีส่วนช่วยในโครงการของฉันเลย

สิ่งที่แก้ปัญหาของฉันได้จริงคือ:

  • วางแต่ละท้ายทุกคลาสไว้ในไฟล์ของตัวเอง
  • วางแต่ละนามสกุลในไฟล์ของตัวเอง (Class + ExtName.swift)
  • วาง "out of class swift method" ในไฟล์ของตัวเอง

ตอนนี้ฉันมีการใช้งาน CPU เกือบเป็นศูนย์การใช้หน่วยความจำต่ำและเสร็จสิ้นอย่างรวดเร็วพอสมควร


2

โดยทั่วไปการย้ายโฟลเดอร์แคช (DerivedData) ไปยังไดรฟ์ SSD (โดยเฉพาะในกรณีของฉัน - ที่เก็บข้อมูลภายนอกที่เชื่อมต่อกับทางออกสายฟ้า) ได้ปรับปรุงประสิทธิภาพ Xcode ของฉันอย่างมาก .. เวลาในการรวบรวมและข้อสงสัยทั่วไปเกี่ยวกับแอปเร็วขึ้นประมาณ 10 เท่า .. ยังย้ายโฟลเดอร์ git ทั้งหมดไปยัง SSD ซึ่งปรับปรุงประสิทธิภาพของคอมไพล์อย่างมาก


จริงๆแล้วในปัญหาดั้งเดิมฉันได้อัปเกรด mac ของฉันด้วยไดรฟ์ SSD แล้วและทุกอย่างก็หมดไป ระบบปฏิบัติการและยังคงมีปัญหาอยู่
mllm

2

มันปวดจนกระทั่ง XCode 7.2

Apple แก้ไขแล้วใน XCode 7.3 และตอนนี้ก็ใช้งานได้เหมือนมีเสน่ห์ มันเร็วมากและทรงพลังกว่ามากเพราะดูเหมือนว่าจะทำงานได้เหมือนกับการค้นหาไฟล์ที่คลุมเครือ: คุณไม่จำเป็นต้องพิมพ์จุดเริ่มต้นที่แน่นอนของ method / property เพื่อให้มันปรากฏในรายการประพจน์


2

การยุบวิธีทั้งหมดช่วยได้เล็กน้อย

command-alt-shift- ลูกศรซ้ายจะทำเคล็ดลับ ...

วิธีพับ / คลี่วิธีปัจจุบันหรือถ้าโครงสร้างใช้:

พับ: command-alt- ลูกศรซ้าย

แฉ: command-alt- ลูกศรขวา


1

SourceKitServiceนอกจากนี้ยังค่อนข้างเงอะงะในการจัดการกับความคิดเห็นในโค้ดและความคิดเห็นที่ฝังไว้ก็ทำให้ช้าลงเช่นกัน

ดังนั้นหากคุณสามารถที่จะลบความคิดเห็นที่ฝังไว้จำนวนมากเช่นนี้:

/*
 * comment 
    /*
     * embedded comment
     */
 */

ที่สามารถช่วยได้อย่างแน่นอน


หมายเหตุ:ในกรณีของฉัน Xcode 7.3.1 (7D1014) ถูกบล็อกอย่างแท้จริงให้ฉันพิมพ์ตัวอักษรใด ๆ เมื่อไฟล์มีความคิดเห็นประมาณ 700 บรรทัดพร้อมความคิดเห็นที่ฝังอยู่ ตอนแรกฉันลบบล็อกนั้นออกจาก.swiftไฟล์นั้นและ Xcode ก็กลับมามีชีวิตอีกครั้ง ฉันพยายามเพิ่มความคิดเห็นกลับทีละส่วนโดยการลบความคิดเห็นที่ฝังไว้ออก แต่ก็ยังช้ากว่าปกติ แต่ก็แสดงประสิทธิภาพที่ดีขึ้นอย่างมากหากไม่มีความคิดเห็นที่ฝังไว้


1

ฉันมีปัญหาเดียวกันกับที่การพิมพ์ล่าช้าในชั้นเรียนหนึ่ง ๆ และปรากฎว่า

/* Long multiline comments */

กำลังทำให้การพิมพ์ช้าลง

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