gpt4 book ai didi

swift - 如何在 swift 中替换++ 运算符后减少 while 循环的执行时间?

转载 作者:搜寻专家 更新时间:2023-11-01 06:06:23 24 4
gpt4 key购买 nike

新的 Xcode (7.3) 警告增量运算符++ 将在下一个 swift3 中被删除。我用++ 进行了 while 循环(见下文)。在我删除增量运算符++ 之后,这个循环比++ 慢三倍。更改此 while 循环的更好方法是什么?

之前

 var first = string1.startIndex
var last = first.advancedBy(n, limit: string1.endIndex)
var myarray = [String]()

while last != string1.endIndex
{
myarray.append(string1[first++...last++])
}

之后

 var first = string1.startIndex
var last = first.advancedBy(n, limit: string1.endIndex)
var myarray = [String]()

while last != string1.endIndex
{
myarray.append(string1[first...last])

first = first.advancedBy(1) // or first = first.successor()
last = first.advancedBy(n, limit: string1.endIndex) // or last = last.successor()

}

最佳答案

使用预分配和随机访问分配,而不是重复将元素附加到数组

添加行 first = ...last = ...不应该像重复附加 元素(并因此重复扩展您的数组)到尚未预先分配的数组那样影响性能。如果您初始化数组 myarray,您应该能够减少开销并使用随机访问 ( myarray[i] ) 来分配滑动窗口字符串值,而不是使用 .append(...) .

var first = string1.startIndex
var last = first.advancedBy(n, limit: string1.endIndex)
var myarray = [String](count: string1.characters.count-n,
repeatedValue: "")

for i in 0..<myarray.count {
myarray[i] = string1[first...last]

first = first.advancedBy(1)
last = first.advancedBy(n, limit: string1.endIndex)
}

基准

我使用了以下示例 string1n将上面修改后的解决方案与您自己的解决方案进行基准测试:

var string1 = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce pretium diam at arcu suscipit, sed molestie mi rhoncus. Donec neque sapien, luctus ultricies ex sed, tristique auctor sem. Praesent varius ullamcorper nisi a commodo. Mauris eu rutrum enim, sit amet hendrerit velit. Curabitur iaculis neque ut tellus pretium, at convallis odio posuere. Integer ultricies diam ex, sit amet faucibus odio ultrices eu. Morbi tincidunt felis tellus, eget gravida est suscipit quis. Nam nunc ipsum, molestie sit amet neque at, aliquam maximus lacus. Sed bibendum massa a lorem eleifend, non eleifend felis commodo. Vivamus eget sem luctus, aliquam dolor nec, finibus diam. Morbi id justo vehicula, eleifend arcu nec, hendrerit neque. Donec ex ante, fringilla id rhoncus nec, porta id tortor. Donec dapibus nisl nibh, non posuere lacus egestas non. Duis massa quam, elementum sit amet volutpat eget, tincidunt sodales urna. Donec at congue ligula, a sollicitudin tortor."
string1 = string1+string1+string1 // 2880 characters
let n = 4

基准测试结果(使用 this QuartzCore -based function 测量)

  • 预初始化数组解决方案 for i in ...循环:2.5s
  • .append(..)解决方案 while循环,如您的问题所示:32.5s

如果执行时间很重要,显然您可以通过预初始化数组和使用随机访问分配而不是重复使用 .append(..) 获益。 .


最后,您可以问自己是否真的需要显式存储滑动窗口中的所有子字符串,或者是否足以存储与它们对应的范围。如果n很大,myarray above 将包含大量重复字符/重叠子字符串。在这种情况下,您最好只保存 Range<String.CharacterView.Index> 的数组。元素,可以很容易地用于提取 string1 的相关子字符串在飞行中。例如:

var first = string1.startIndex
var last = first.advancedBy(n, limit: string1.endIndex)
var rangeArr = [Range<String.CharacterView.Index>](
count: string1.characters.count-n,
repeatedValue: first...last)

for i in 0..<rangeArr.count {
rangeArr[i] = first...last

first = first.advancedBy(1)
last = first.advancedBy(n, limit: string1.endIndex)
}

关于swift - 如何在 swift 中替换++ 运算符后减少 while 循环的执行时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36189116/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com