gpt4 book ai didi

ios - Swift playground 执行速度

转载 作者:IT王子 更新时间:2023-10-29 05:24:10 24 4
gpt4 key购买 nike

有没有办法提高 playground 的执行速度?我想迭代很多周期而不是等待 10 分钟。

例如:

import UIKit

var count = 0
for var i = 0; i < 1000000000; i++ {
count++
}

这段代码执行的时间太长了。但我想快速得到结果。

最佳答案

最大的性能 killer 之一是 Playground 右侧的输出。现在我将向您展示如何最小化此输出。

请参阅最后的示例代码。


最佳表现

最高效的方法是将所有性能关键代码放在 playground 的 Sources 文件夹内的 .swift 文件中。

注意:为了使用Sources 文件夹中的函数、类、属性和方法,您必须将它们标记为public。如果你想继承一个类,它必须被标记为open


性能好但代码丑陋

以下方法(我认为这不是官方/预期的)可用于禁用 Playground 输出,但也会导致难看的代码。然而,暂时禁用输出是有好处的。

有两种主要方法(和两种技巧)可以实现最小输出量(如果您找到更好的方法请告诉我们):

  1. Void(或 Void?)表达式周围使用括号,如赋值(通常不会产生任何输出,另见 3.)。

    var x = 0       // output: 0
    (x = 1) // NO output
    (x = 2 * x - 1) // NO output
    (x.negate()) // NO output

    注意:在 Swift 中,赋值返回 Void 并且在 optional chaining 的情况下它是 Void?

    var x: (Int, Int)? = nil
    if (x?.0 = 0) != nil {
    // assignment was successful (x!=0 and now x=(0, x.1))
    } else {
    // assignment was not successful (x==nil)
    }
  2. 分别初始化和声明变量。

    var x: Int // NO output
    (x = 0) // NO output
  3. 如果 1. 不起作用,请在 () 上方或下方添加额外的 no-op(无操作)行。

    这发生在单行闭包中(并且可能在其他一些上下文中)例如:(另请参见下面的代码)

    [1, 4, 5, 6].mmap{
    () // without this line the line below would yield to an output
    ($1 = $0 + 1)
    } as [Int]
  4. 您也可以使用所有表达式的元组,然后将其分配给一个变量,而不是将每一行都用括号括起来:

    var a: Any // this may be a useful definition in this context
    var x: Int
    var y: Int
    (a = (x = 0,
    y = 1,
    x = y + 1,
    y = x*x))

    然而,这可能会导致缩进灾难......

哪里不起作用(我找不到删除输出的方法;此列表可能不完整):

  1. 在函数和闭包中返回
  2. 声明可选变量,例如:var x: Int?

Sequence 上的新 map 方法示例

用法:见上文第 3 点。

Sequence.map的签名是

func map<T>(_ transform: (Self.Element) throws -> T) rethrows -> [T]

由于我还没有找到一种方法来删除 return 的输出,因此可以使用带有 inout 参数的闭包(使用任务)。一个可能的签名可能是:

func mmap<U>(_ transform: (Element, inout U?) -> ()) -> [U]

所以我们可以在 inout 参数中传递 nil,因为它是每个可能的 U 的良好默认值,而不会对 施加约束>U 这可能需要一个实例生成器(例如:init() { ... })。

不幸的是,Swfit 很难推断出 U,因此您需要使用显式类型注释来帮助编译器。另外 var newElement: U? does 在边栏中返回 nil

现在我将使用 Any 而不是 U?:

extension Sequence {
// ATTENTION: this is not as performant as the normal `map`!
func mmap<U>(transform: (Element, inout Any) -> ()) -> [U] {
var result: [U]
(result = [U]())
for element in self {
var newElement: Any
(newElement = 0) // some placeholder element
(transform(element, &newElement))
// assume the inout element to be of type `U`
(result.append(newElement as! U))
}
return result // the ONLY output in this method
}
}

您的示例代码

使用 swift 4

var count = 0
for i in 0..<1_000_000_000 {
(count += 1)
if count % 100_000 == 0 {
// print only every 100_000th loop iteration
print(count)
}
}

没有括号:每秒大约 10.000 次循环迭代

带括号:每秒约 10.000.000 次循环迭代!!!

关于ios - Swift playground 执行速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26073192/

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