快速添加Strings非常快速

时间:2016-07-24 11:13:24

标签: swift string optimization concatenation

以下代码显示了构建电子表格的两种方法: 使用:

str = str + "\(number) ; "

str.append("\(number)");

两者都非常慢,因为我认为,他们丢弃两个字符串并制作第三个字符串,这是前两个字符串的串联。 现在,如果我重复这个操作数十万次来生成一个电子表格......这会产生大量的分配。

例如,下面的代码需要11秒才能在我的MacBook Pro 2016上执行:

    let start = Date()
    var str = "";

    for i in 0 ..< 86400
    {
        for j in 0 ..< 80
        {
//          Use either one, no difference
//          str = str + "\(Double(j) * 1.23456789086756 + Double(i)) ; "
            str.append("\(Double(j) * 1.23456789086756 + Double(i)) ; ");
        }

        str.append("\n")
    }

    let duration = Date().timeIntervalSinceReferenceDate - start.timeIntervalSinceReferenceDate;
    print(duration);

如何在不必将双打转换为字符串的情况下解决此问题?我已经坚持了3天......我的编程技巧非常有限,你可以从上面的代码中看到......

我试过了:

var str = NSMutableString(capacity: 86400*80*20);

但是编译器告诉我:

Variable 'str' was never mutated; consider changing to 'let' constant

尽管

str.append("\(Double(j) * 1.23456789086756 + Double(i)) ; ");

显然,调用append不会改变字符串......

1 个答案:

答案 0 :(得分:2)

我尝试将它写入数组,限制因素似乎是将double转换为字符串。

下面的代码需要13秒左右的空气

这样做

arr[i][j] = "1.23456789086756"

将执行时间减少到2秒,因此在将Double转换为String时需要11秒。您可以通过编写自己的转换例程来缩短一些时间,但这似乎是限制因素。我尝试使用内存流,这似乎更慢。

 var start = Date()

        var arr = Array(repeating: Array(repeating: "1.23456789086756", count: 80), count: 86400 )
        var duration = Date().timeIntervalSinceReferenceDate - start.timeIntervalSinceReferenceDate;
        print(duration); //0.007
        start = Date()

        var a = 1.23456789086756

        for i in 0 ..< 86400
        {
            for j in 0 ..< 80
            {
                arr[i][j] = "\(a)" // "1.23456789086756" //String(a)
            }
        }

        duration = Date().timeIntervalSinceReferenceDate - start.timeIntervalSinceReferenceDate;
        print(duration); //13.46 or 2.3 with the string