我意识到,通过在Swift中将属性和方法设为final,我可以改善编译时间和应用程序的性能。最近我读了一篇苹果的博客文章:https://developer.apple.com/swift/blog/?id=27,它说让属性或方法(文件)私有(博客文章可以追溯到2015年,当时“私有”意味着“文件加密”)使编译器能够通过在源文件中搜索任何重写来推断属性或方法的“终结性”。但是“真正的”(Swift 3)私人版呢?编译器不应该在任何地方搜索潜在的覆盖,所以我的问题是:
这两个声明之间是否存在性能和/或编译时间上的差异?
private final var foo: Int
private var bar: Int发布于 2017-08-04 16:48:57
标记为private的方法或属性为隐式final。在@conarch提供的测试中,有一个副作用-- Dispatching类。
我做了和fallow一样的测试:
class UseFinal {
private final var foo = 1
}
class NoUseFinal {
private var foo = 1
}
var start = Date()
print(NoUseFinal())
print(UseFinal())
print("construct takes \(Date().timeIntervalSince(start))")
start = Date()
for _ in 1...1_000_000 {
let temp = NoUseFinal()
}
print("noUseFinal took \(Date().timeIntervalSince(start))")
start = Date()
for _ in 1...1_000_000 {
let temp = UseFinal()
}
print("useFinal took \(Date().timeIntervalSince(start))")
print("----")
start = Date()
for _ in 1...1_000_000 {
let temp = UseFinal()
}
print("useFinal took \(Date().timeIntervalSince(start))")
start = Date()
for _ in 1...1_000_000 {
let temp = NoUseFinal()
}
print("noUseFinal took \(Date().timeIntervalSince(start))")我得到的结果如下:
NoUseFinal
UseFinal
----
construct takes 0.000900983810424805
noUseFinal took 0.182932019233704
useFinal took 0.182898044586182
----
useFinal took 0.183371007442474
noUseFinal took 0.182500004768372因此,对于dispatcher,private和private final方法或属性没有区别
发布于 2017-03-18 05:16:09
我做了两个简单的类:
class UseFinal
{
private final var foo = 1
}
class NoUseFinal
{
private var foo = 1
}并运行以下代码:
var start = Date()
for _ in 1...100000
{
let temp = NoUseFinal()
}
print("noUseFinal took \(Date().timeIntervalSince(start))")
start = Date()
for _ in 1...100000
{
let temp = UseFinal()
}
print("useFinal took \(Date().timeIntervalSince(start))")结果一致地表明,添加"final“显然运行得更快。一个输出示例:
noUseFinal took 0.0214230418205261
useFinal took 0.0155709981918335编辑
出于好奇,也因为之前的拼写错误,我尝试更改了for循环的顺序,以便首先命中UseFinal类。这导致该类的运行时间更长:即计时与另一次运行几乎相同,只是现在UseFinal运行的时间更长。这使我现在相信……没有什么不同。我认为它们归根结底是完全相同的部分。
发布于 2018-01-31 16:08:57
在runtime.In中使用final来减少动态调度,这样性能会更好。
程序必须在运行时确定所引用的方法或性能,然后执行间接调用或间接访问。这种技术称为动态调度。
用于可见性的private关键字。当你使用private时,如果编译器发现没有被覆盖的声明,那么编译器会在前面推断出一个final关键字,然后所有的调用都会变成直接的。性能也得到了提高。但不应该像final那样好。
https://stackoverflow.com/questions/42865789
复制相似问题