Bazı "basit" kodlar yazarken de% 100 + CPU deneyimi yaşadım. Kodunuzu yapılandırma şeklinizle hızlı ayrıştırıcıyı daha hızlı hale getirmek için bazı küçük püf noktaları.
Dizelerde "+" birleştirici kullanmayın. Benim için bu, yavaşlığı çok hızlı tetikliyor. Her yeni "+" ayrıştırıcıyı bir taramaya götürür ve işlev gövdenizde herhangi bir yere yeni bir karakter eklediğiniz her seferinde kodu yeniden ayrıştırması gerekir.
Onun yerine:
var str = "This" + String(myArray.count) + " is " + String(someVar)
Hızlı bir şekilde ayrıştırmak için çok daha verimli görünen şablon sözdizimini kullanın:
var str = "This \(myArray.count) is \(someVar)"
Bu şekilde temelde satır içi değişkenler "\ (*)" ile strlen'de bir sınır olmadığını görüyorum.
+ / * Kullanan hesaplamalarınız varsa, bunları daha küçük parçalara bölün.
Onun yerine:
var result = pi * 2 * radius
kullanın:
var result = pi * 2
result *= radius
Daha az verimli görünebilir, ancak hızlı ayrıştırıcı bu şekilde çok daha hızlıdır. Bazı formüller, matematiksel olarak doğru olsalar bile, çok sayıda işlem yapmak zorunda kalırlarsa derlenmezler.
Bazı karmaşık hesaplamalarınız varsa, onu bir func'a koyun. Bu şekilde, ayrıştırıcı bunu bir kez ayrıştırabilir ve işlev bedeninizde bir şeyi her değiştirdiğinizde yeniden ayrıştırmak zorunda kalmaz.
Çünkü işlev gövdenizde bir hesaplama varsa, o zaman bir şekilde hızlı ayrıştırıcı türlerin, sözdiziminin vb. Hala doğru olup olmadığını her seferinde kontrol eder. Hesaplamanın üzerinde bir çizgi değişirse, hesaplamanızın / formülünüzün içindeki bazı değişkenler değişmiş olabilir. Harici bir işleve koyarsanız, bir kez doğrulanır ve hızlı bir şekilde doğru olacağından ve sürekli olarak yeniden ayrıştırmadığından mutlu olur, bu da yüksek CPU kullanımına neden olur.
Bu şekilde her tuşa basıldığında% 100'den yazarken düşük CPU'ya ulaştım. Örneğin, işlev bedeninize satır içi olarak yerleştirilen bu 3 satır, hızlı ayrıştırıcıyı bir taramaya getirebilir.
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 )
ancak bir işlev koyup sonra ararsam, hızlı ayrıştırıcı çok daha hızlı
// 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 ve XCode 6.1 hala çok hatalı, ancak bu basit hileleri takip ederseniz, kod düzenleme tekrar kabul edilebilir hale gelir. .H dosyalarından kurtulduğu ve çok daha temiz sözdizimi kullandığı için swift'i çok tercih ederim. "MyVar as AnyObject" gibi hala çok sayıda tip döküm gerekli, ancak karmaşık amaç-c proje yapısı ve sözdizimi ile karşılaştırıldığında bu daha küçük bir kötülük.
Ayrıca başka bir deneyim, kullanımı eğlenceli olan SpriteKit'i denedim, ancak 60 fps'de sabit bir yeniden boyamaya ihtiyacınız yoksa oldukça verimsiz. Sprite'larınız o kadar sık değişmiyorsa, eski CALayer'ları kullanmak CPU için çok daha iyidir. Katmanların .content'lerini değiştirmezseniz, CPU temelde boşta kalır, ancak arka planda çalışan bir SpriteKit uygulamanız varsa, diğer uygulamalardaki video oynatma, 60 fps'lik sınırlı güncelleme döngüsü nedeniyle takılmaya başlayabilir.
Bazen xcode derleme sırasında tuhaf hatalar gösterir, sonra "Ürün> Temizle" menüsüne gidip onu tekrar derlemek yardımcı olur, önbelleğin hatalı bir uygulaması gibi görünür.
Xcode kodunuzla sıkıştığında ayrıştırmayı iyileştirmenin bir başka harika yolu da buradaki başka bir yığın aşımı gönderisinde belirtilmiştir . Temel olarak, .swift dosyanızdaki tüm içeriği harici bir düzenleyiciye kopyalarsınız ve ardından işlevlerine göre işlev görürsünüz, onu geri kopyalayın ve darboğazınızın nerede olduğunu görün. Bu, projem% 100 CPU ile çıldırdıktan sonra, xcode'u tekrar makul bir hıza getirmeme yardımcı oldu. kodunuzu geri kopyalarken, onu yeniden düzenleyebilir ve işlev bedenlerinizi kısa ve işlevler / formüller / ifadeler basit (veya birkaç satıra bölünmüş) tutmaya çalışabilirsiniz.