gpt4 book ai didi

swift - 为什么 `String(describing: Class.self)` 比 `NSStringFromClass(Class.self)` 慢?

转载 作者:可可西里 更新时间:2023-11-01 00:27:47 27 4
gpt4 key购买 nike

考虑以下程序:

import Foundation
import QuartzCore

class C: NSObject {}

func benchmark() {
let swift1 = CACurrentMediaTime()
let swiftString = String(describing: C.self)
let swift2 = CACurrentMediaTime()

let objc1 = CACurrentMediaTime()
let objcString = NSStringFromClass(C.self)
let objc2 = CACurrentMediaTime()

let timeForSwiftString = swift2 - swift1
let timeForObjcString = objc2 - objc1
print("timeForSwiftString / timeForObjcString:", timeForSwiftString / timeForObjcString)
}

for _ in 0..<20 {
benchmark()
}

输出看起来像

timeForSwiftString / timeForObjcString: 21.023079257409023
timeForSwiftString / timeForObjcString: 1.8032004909527086
timeForSwiftString / timeForObjcString: 2.929076507541501
timeForSwiftString / timeForObjcString: 3.1707763580662034
timeForSwiftString / timeForObjcString: 2.884789101770234
timeForSwiftString / timeForObjcString: 3.167761588431754
timeForSwiftString / timeForObjcString: 3.0066055331053776
timeForSwiftString / timeForObjcString: 3.0707174733951255
timeForSwiftString / timeForObjcString: 3.213085166384659
timeForSwiftString / timeForObjcString: 2.830997374357457
timeForSwiftString / timeForObjcString: 3.24157236450268
timeForSwiftString / timeForObjcString: 3.0462955824531646
timeForSwiftString / timeForObjcString: 2.887874789238326
timeForSwiftString / timeForObjcString: 3.1071486398963732
timeForSwiftString / timeForObjcString: 2.995876045716979
timeForSwiftString / timeForObjcString: 3.073833893272912
timeForSwiftString / timeForObjcString: 2.965068621921414
timeForSwiftString / timeForObjcString: 3.0622197750334306
timeForSwiftString / timeForObjcString: 3.0484172031541656
timeForSwiftString / timeForObjcString: 1.9362930766842597

第一次测量总是最昂贵的(可能是由于一些懒惰的运行时操作),所以我们将跳过它。

所有其他测量结果表明,swift 更慢。

我还有一个 demo project有一个从 1000 个不同类中获取字符串的基准,它显示:

  • Swift 的 String(describing: Class.self) 比 Objective-C 的 NSClassFromString(Class.self) 慢(30..150μs vs 4. .12微秒)

  • 在不同的类上调用 Swift 的 String(describing: Class.self) 随着每个新类的增加而变得越来越慢,而 Objective-C 时间保持不变

对这种行为有什么想法吗?

最佳答案

perhaps due to some lazy runtime actions

准确地说,由于各种原因(包括动态加载库的解析),对任何内容的首次调用可能会变慢。

Any ideas for such a behavior?

第一个猜测是 String(describing:)任何值,弄清楚它是什么类型的值(它的描述表明它测试符合三个不同的协议(protocol)),然后调用适当的函数来描述该值。而 NSStringFromClass 只取 Class 值,在编译时检查,然后直接调用运行时函数将类名作为字符串获取,不需要任何测试和根据传递的值类型进行分支。

TLDR:更多的工作需要更多的时间,测试和分支会减慢你的速度。

HTH

关于swift - 为什么 `String(describing: Class.self)` 比 `NSStringFromClass(Class.self)` 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55206679/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com