首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift - private var/func与private final var/func

Swift - private var/func与private final var/func
EN

Stack Overflow用户
提问于 2017-03-18 03:35:24
回答 4查看 1.9K关注 0票数 1

我意识到,通过在Swift中将属性和方法设为final,我可以改善编译时间和应用程序的性能。最近我读了一篇苹果的博客文章:https://developer.apple.com/swift/blog/?id=27,它说让属性或方法(文件)私有(博客文章可以追溯到2015年,当时“私有”意味着“文件加密”)使编译器能够通过在源文件中搜索任何重写来推断属性或方法的“终结性”。但是“真正的”(Swift 3)私人版呢?编译器不应该在任何地方搜索潜在的覆盖,所以我的问题是:

这两个声明之间是否存在性能和/或编译时间上的差异?

代码语言:javascript
复制
private final var foo: Int

private var bar: Int
EN

回答 4

Stack Overflow用户

发布于 2017-08-04 16:48:57

标记为private的方法或属性为隐式final。在@conarch提供的测试中,有一个副作用-- Dispatching类。

我做了和fallow一样的测试:

代码语言:javascript
复制
    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))")

我得到的结果如下:

代码语言:javascript
复制
NoUseFinal
UseFinal
----
construct takes 0.000900983810424805
noUseFinal took 0.182932019233704
useFinal took   0.182898044586182
----
useFinal took   0.183371007442474
noUseFinal took 0.182500004768372

因此,对于dispatcher,privateprivate final方法或属性没有区别

票数 4
EN

Stack Overflow用户

发布于 2017-03-18 05:16:09

我做了两个简单的类:

代码语言:javascript
复制
class UseFinal
{
    private final var foo = 1
}

class NoUseFinal
{
    private var foo = 1
}

并运行以下代码:

代码语言:javascript
复制
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“显然运行得更快。一个输出示例:

代码语言:javascript
复制
noUseFinal took 0.0214230418205261
useFinal took   0.0155709981918335

编辑

出于好奇,也因为之前的拼写错误,我尝试更改了for循环的顺序,以便首先命中UseFinal类。这导致该类的运行时间更长:即计时与另一次运行几乎相同,只是现在UseFinal运行的时间更长。这使我现在相信……没有什么不同。我认为它们归根结底是完全相同的部分。

票数 2
EN

Stack Overflow用户

发布于 2018-01-31 16:08:57

在runtime.In中使用final来减少动态调度,这样性能会更好。

程序必须在运行时确定所引用的方法或性能,然后执行间接调用或间接访问。这种技术称为动态调度。

用于可见性的private关键字。当你使用private时,如果编译器发现没有被覆盖的声明,那么编译器会在前面推断出一个final关键字,然后所有的调用都会变成直接的。性能也得到了提高。但不应该像final那样好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42865789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档