在swift中添加字符串真的很快



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

str = str + "(number) ; "

str.append("(number)");

两者都很慢,因为我认为,它们丢弃了两个字符串,并生成了第三个字符串,即前两个字符串的串联。现在,如果我重复这个操作数十万次来生成一个电子表格。。。这需要大量的拨款。

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

    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);

我如何解决这个问题而不必自己将双打转换为字符串?我已经被这个问题困扰了三天。。。我的编程技能非常有限,你可能会从上面的代码中看到。。。

我试过了:

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不会使字符串发生突变。。。

我尝试将其写入数组,限制因素似乎是将双精度转换为字符串。

下面的代码在我的空中上需要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

最新更新