【问题标题】:swift string append mechanics快速字符串附加机制
【发布时间】:2016-04-24 09:51:49
【问题描述】:

当我在 Swift 中使用 += 运算符将一个字符串附加到另一个字符串时,代码中会执行什么过程?如果我执行 str1+=str2,是在 str1 的末尾分配内存并将 str2 复制到那里,还是为新字符串的组合长度分配内存,然后复制字符串? 我编写了一种将字符串附加在一起的线性方法和一种二等分方法,并对这两种方法进行了计时。二等分方法仅比线性方法快 2 倍。追加过程中是否有任何机制可以解释这两种方法的时间如此相似?

    var start = NSDate().timeIntervalSince1970
    let _ = stringMe(400000000, str:"Developers! ")
    var end = NSDate().timeIntervalSince1970

    var duration = end - start;
    print("stringMe takes: \(duration)");


    start = NSDate().timeIntervalSince1970
     let _ = stringMe2(400000000, str:"Developers! ")
     end = NSDate().timeIntervalSince1970

    duration = end - start;
    print("stringMe2 takes: \(duration)");


func stringMe(n:Int, str:String)-> String {

    var string = ""

    for _ in 0..<n{
        string += str
    }


    return string
}

func stringMe2(n:Int, str:String)->String
{

    var string = str

    var currentWritten = 1

    while currentWritten < n {

        if currentWritten*2>n {

            string += stringMe2(n-currentWritten, str: str)

            break

        }


        currentWritten*=2
        string+=string

    }

    return string

}

【问题讨论】:

    标签: string swift append low-level


    【解决方案1】:

    我不知道您的计算机有多少内存,但我们正在查看最后一组串联中的 4.8G 字符串。这意味着当您按顺序增长字符串时,堆管理不太可能导致页面错误。

    假设每个字符串连接分配一个新的内存块,然后复制两个字符串以获得结果,然后释放原始内存以供以后重用。

    依次,从第 3 次连接开始,前两次操作释放的内存大到足以容纳下一个结果。这不会导致页面错误,直到它非常接近限制(如果它确实如此)。

    另一方面,指数复制永远不会找到足够大的可重用内存来获得下一个结果,并且会达到虚拟内存垃圾阈值,即它需要分页出部分源和分页某些目标的点.

    顺序连接永远不需要比源和目标的大小加上一个字符串实例更多的内存:即 2n + 1 倍字符串(大约:9.6Gb)。在接下来的两次操作中,它将释放 n 和 n+1,这将给它足够的空间来容纳至少一个 n+3 的副本。

    指数级联需要一个源副本和一个两倍大的目标。 n + 2*n 在内存中用于复制操作(大约 14.4Gb)。在接下来的操作中,它将释放 3*n,但结果所需的内存块将是 4*n,然后释放 7*n,它将需要 8*n,依此类推,永远找不到足够大的块

    随着指数复制的进行,它会创建越来越多的分页,而顺序方法甚至可能无法达到阈值。

    总之,您的数字太大而无法进行有意义的比较,因为您遇到了影响结果的内存问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 2013-01-20
      相关资源
      最近更新 更多