首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift游乐场执行速度

Swift游乐场执行速度
EN

Stack Overflow用户
提问于 2014-09-27 17:23:25
回答 4查看 3.2K关注 0票数 14

有没有办法提高游乐场的执行速度?我想要迭代许多周期,而不是等待10分钟。

例如:

代码语言:javascript
复制
import UIKit

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

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

EN

回答 4

Stack Overflow用户

发布于 2017-11-29 07:17:48

最大的性能杀手之一是游乐场右侧的输出。现在,我将向您展示如何最小化此输出。

有关示例代码,请参阅末尾的。

最佳性能

性能最好的方法是将所有性能关键代码放在游乐场的Sources文件夹内的.swift文件中。

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

性能很好,但代码丑陋

下面的方法(我认为这不是官方的/预期的)可以用来禁用操场输出,但也会导致丑陋的代码。但是,它对于临时禁用输出是有好处的。

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

  1. 使用括号将Void (或Void?)表达式括起来,例如赋值(通常不会导致输出,另请参阅3)。

X.negate x=0 //输出:0 (x = 1) //无输出(x =2*x- 1) //无输出( var ()) //无输出

注意:在Swift中,赋值返回Void,如果是optional chaining,则返回Void?

var x:(Int,Int)?= nil if (x?.0 = 0) != nil { //赋值成功(x!=0,现在x=(0,x.1)) } else { //赋值不成功(x==nil) }

  • 分别初始化和声明变量。

var x: Int // NO output (x = 0) // NO output

  • If 1.不工作在()之上或之下添加额外的no-op (无操作)行。

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

1,4,5,6.mmap{ () //如果没有此行,下面的行将输出($1 = $0 + 1) }作为整数

  • ,您也可以使用所有表达式的元组,然后将其赋给变量。

var a: Any //这在此上下文中可能是一个有用的定义var x: Int var y: Int (a = (x = 0,y= 1,x=y+ 1,y= x*x))

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

(我没有找到如何删除输出的方法;下面的列表可能不完整):

  1. returns in functions和closures
  2. Declaration of Optional variables,例如:var x: Int?

Sequence上新的map方法的一个示例

用法:见上文第3点。

Sequence.map的签名是

代码语言:javascript
复制
func map<T>(_ transform: (Self.Element) throws -> T) rethrows -> [T]

因为我还没有找到一种方法来删除返回值的输出,所以可以使用带有inout参数的闭包(通过赋值获得“return”值)。然后,可能的签名可以是:

代码语言:javascript
复制
func mmap<U>(_ transform: (Element, inout U?) -> ()) -> [U]

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

不幸的是,Swfit很难推断出U,所以你需要用显式的类型注释来帮助编译器。此外,var newElement: U? 确实会在侧边栏中返回 nil

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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次循环迭代!

票数 8
EN

Stack Overflow用户

发布于 2016-01-31 04:13:41

我能感受到你的痛苦,我只是在把2D函数打印到[Double],然后再转换成UIImageView。其中一个步骤是对数百万像素进行迭代,这将耗费很长时间。

任何计算密集、重复或可能耗时的东西都应该放在游乐场的"Sources“文件夹中。这样,代码在游乐场运行之前就被预编译了。将该for循环的输出放入可从操场调用的公共函数中。这样,您就不必坐在那里观察游乐场在for循环中的所有次数。

票数 5
EN

Stack Overflow用户

发布于 2017-03-16 04:55:56

我有一个这样的问题,经过几天的试验,我已经解决了它。我所需要做的就是将我所有的代码移动到playground的Sources文件夹中。因此,在此之后,执行速度得到了提高。我希望它能对你有所帮助。

注意:不要忘记使用开放类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26073192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档