- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
考虑以下程序:
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/
各位开发者大家好, 我目前正面临一些 Swift 3 代码的奇怪问题。 我有一个自定义日志记录类(使用 XCGLogger): struct Log { #if DEBUG f
它们中的每一个都调用不同的构造函数。 let cell = tableView.dequeueReusableCellWithIdentifier(NSStringFromClass(MessageS
你会认为这会返回一个 NSString: NSString *class = NSStringFromClass([[_array objectAtIndex:([_array count] -2)]
我正在 Swift 项目中记录 class 名称和 enums。我在每个实例字符串描述中看到它附加的项目名称作为前缀。例如, 我创建了 NSObject 的扩展, public extension N
大多数(我所见过的)Core Data 教程都使用以下代码片段,其中 @"MyEntityClass" 硬编码在: NSFetchRequest *request = [[NSFetchRequest
我正在为 iPhone 应用程序进行简单的 OCUnit 测试,只是想断言应用程序委托(delegate)是我预期的类的实例。没想到这个测试非常有用,结果却暴露了我对Objective C的一个误解。
我有 NSDistantObject 类对象数组。 NSLog(@"%@", [[saveClassObject objectAtIndex:0] connectionForProxy]);
NSStringFromClass为类引用提供完全限定的类名,例如 ".self" NSStringClassFromString提供类的类引用 AnyClass对于完全限定的类名,如 "." 。 但
我知道 this question关于我们如何在 Swift 中获得 objective-c 类的可读类名。 我想要实现的是从 objective-c 中获取 Swift 类的可读类名,而不用模块破坏
Swift 中是否有 NSStringFromClass 的等价物,它提供了类名的用户可读版本?我尝试将它与我创建的 native Swift 类一起使用,但如您所见,结果似乎是编译器对类名的内部表示
考虑以下程序: import Foundation import QuartzCore class C: NSObject {} func benchmark() { let swift1 =
if([@"" class] == NSClassFromString(NSStringFromClass([@"" class]))) printf("foo"); else pri
我注意到在默认使用 ARC 的最新版本的 Xcode 中,当您开始一个新项目时 Xcode 为您生成的 main.m 文件使用 NSStringFromClass([AppDelegate class
我是一名优秀的程序员,十分优秀!