2015-02-19 15 views
8

Aşağıdaki tip kadrolardan kaynaklanan farklı çalışma zamanı maliyetleri nelerdir? Sabit aitSwift'in kadrolarının çalışma zamanı maliyeti nedir?

  1. Sayısal döküm, ör .:

    let f = 0.1 as CGFloat 
    

    Ben bu sıfır çalışma zamanı maliyetine sahip hayal ediyorum. zamanı değeriyle, ör .:

    let f = someDoubleValue as CGFloat 
    

    ait

  2. Sayısal dökme Bu son derece küçük çalışma zamanı maliyetine sahip hayal ediyorum.

  3. hava bacası, ör .:

    let dict: [String: Int] = ... 
    let anyObj = dict as AnyObject 
    

    Ben bu sıfır çalışma zamanı maliyeti beklersiniz.

  4. Failable Hüzünlü, ör .:

    let anyObj: AnyObject = ... 
    if let str = anyObj as? String { ... } 
    

    Bu anyObj dinamik tip hiyerarşisinde sınıflarının sayısı ile orantılı bir çalışma zamanı maliyeti beklersiniz. Hüzünlü Zorla

  5. , ör .:

    let anyObj: AnyObject = ... let str = anyObj as! String 

    Belki zorla downCast için maliyet biraz daha düşüktür?
  6. toplanması ait mahzun Zorla ör .:

    let dates: [AnyObject] = ... 
    for date in dates as! [NSDate] { ... } 
    

    Burada yapılan budur - dates bir NSArray itibaren söz konusu olduğunda? Çalışma zamanı maliyeti, öğelerinin sayısıyla orantılı mı? [String: [String: [Int]]] gibi daha karmaşık bir koleksiyon türüne dönüştürürsem, tüm öğeleri ve alt öğelerinin bu yayınla uyumlu olduğundan emin olmak için tüm koleksiyonun geçişi var mı?

İlk dört vakanın her biri için, benim iddialarım doğru mu? örnek 1, 2 o, diğer non-toplama dökümler için 3.

  • : bu (sayısal döküm ve upcasting gibi) açıkça dökümü yapılabilir ise,

  • +1

    Ben senin birçok sorunun çok fazla olası ve doğru cevaplar vardır sanırım. Örneğin. hayır. 2: bir optimizer, 'f''in nasıl kullanıldığını algılayabilir ve eğer makine mimarisi buna uyuyorsa, 'someDoubleValue' doğrudan' Double' olarak kullanabilirken, diğer durumlarda bu değeri bir miktar daha fazla belleğe kopyalamalıdır. Hafızaya ihtiyaç duyacağı için, tüm kayıtlarda tutulabilir. Bu gibi durumlarda performans söz konusu ise: bir referans noktası oluşturun. –

    +0

    Anladığım kadarıyla, # 3 gerçekten güncel bir örnek değildir, çünkü hızlı sözlük bir yapıdır ve AnyObject'e "dönüştürdüğünüzde" hızlı bir şekilde gerçekten NSDictionary oluşturur. Bu Int -> NSNumber, String -> NSString ve diğerleri için aynı olmalıdır. –

    cevap

    11
    • Bu O (1) (yaklaşık 0) olduğu durum 4, toplama downcastings için 5.

    • :

      • as? O (n) eleman türü kontrol heyecanla gerçekleştirilir, çünkü O (1) olduğu açıktır.eleman türü kontrol heyecanla gerçekleştirilir, çünkü köprülü downcasting (NSArray as! [NSDate]) zorunlu durumda 6.
      • (n O'dır):
      • Ana zorla downcasting (1) eleman türü kontrol ertelenir için O'dur.
      • İç içe geçmiş koleksiyonlar yinelemeli olarak dökümlenir, böylece yukarıdaki kuralları yinelemeli olarak uygularsınız.

    Kaynaklar:

    1. https://github.com/apple/swift/blob/master/stdlib/public/runtime/Casting.cpp
    2. https://github.com/apple/swift/blob/master/stdlib/public/core/ArrayCast.swift
    3. https://github.com/apple/swift/blob/master/stdlib/public/core/HashedCollections.swift.gyb
    +0

    Harika cevap, bunu iyice incelediğiniz için teşekkürler. –

    İlgili konular