Ios 快速执行速度

Ios 快速执行速度,ios,swift,swift-playground,Ios,Swift,Swift Playground,有没有办法提高操场的执行速度? 我想迭代许多循环,而不是等待10分钟 例如: import UIKit var count = 0 for var i = 0; i < 1000000000; i++ { count++ } 导入UIKit 变量计数=0 对于var i=0;i())->[U]{ var结果:[U] (结果=[U]()) 自我元素{ var newElement:Any (newElement=0)//某个占位符元素 (转换(元素和新元素)) //假设inout

有没有办法提高操场的执行速度? 我想迭代许多循环,而不是等待10分钟

例如:

import UIKit

var count = 0
for var i = 0; i < 1000000000; i++ {
    count++
}
导入UIKit
变量计数=0
对于var i=0;i<100000000;i++{
计数++
}

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

我感觉到了你的痛苦,我在玩弄如何将2D函数打印到
[Double]
然后转换到
UIImageView
。其中一个步骤是对数百万像素进行迭代,这需要花费很长时间


任何计算密集型、重复性或潜在耗时的内容都应放在操场的“源”文件夹中。这样,代码将在运行游戏场之前预编译。将
for
循环的输出放在一个公共函数中,您可以从游乐场调用该函数。这样,你就不必坐在那里看着操场在
for
循环中计数

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


注意:不要忘记使用开放式课程。

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

请参见末尾的示例代码


最佳性能 最有效的方法是将所有性能关键代码放在操场的
文件夹中的
.swift
文件中

注意:要使用
Sources
文件夹中的函数、类、属性和方法,必须将它们标记为
public
。如果要对类进行子类化,则必须将其标记为
open


性能很好,但代码很难看 下面的方法(我认为这不是官方的/有意的)可以用来禁用游乐场输出,但也会导致丑陋的代码。但是,它有利于临时禁用输出

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

  • Void
    (或
    Void?
    )表达式(如赋值)周围使用括号(通常不会导致输出,另请参见3)

    注意:在Swift中,分配返回
    Void
    ,如果是
    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)
    }
    
  • 分别初始化和声明变量

    var x: Int // NO output
    (x = 0)    // NO output
    
  • 如果1。不工作在
    ()
    上方或下方添加一个额外的无操作(无操作)行

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

  • 您也可以使用所有表达式的元组,而不是将每一行都用括号括起来,然后将这些表达式赋给一个变量:

    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))
    
    然而,这可能会导致一场灾难

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

  • 返回函数和闭包中的
    s
  • 可选变量的声明,例如:
    var x:Int?

  • 关于
    序列
    用法:见上文第3点

    Sequence.map
    的签名为

    func map<T>(_ transform: (Self.Element) throws -> T) rethrows -> [T]
    
    因此,我们可以在
    inout
    参数中传递
    nil
    ,因为它是所有可能的
    U
    的良好默认值,而不需要对
    U
    施加约束,这可能需要一个实例生成器(例如:
    init(){…}

    不幸的是,Swfit很难推断
    U
    ,因此您需要帮助编译器进行显式类型注释。此外,
    var newElement:U?
    在侧栏中返回
    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
        }
    }
    
    扩展序列{
    //注意:这并不像普通的“地图”那样有效!
    func mmap(transform:(元素,inout Any)->())->[U]{
    var结果:[U]
    (结果=[U]())
    自我元素{
    var newElement:Any
    (newElement=0)//某个占位符元素
    (转换(元素和新元素))
    //假设inout元素的类型为'U'`
    (result.append(新元素为!U))
    }
    返回结果//此方法中的唯一输出
    }
    }
    

    您的示例代码 使用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)
        }
    }
    
    var计数=0
    
    对于0中的i..要加快Xcode游乐场中的构建并防止加载图标永远旋转,请执行以下操作:

  • 转到右侧的侧边栏,在“游乐场设置”中将iOS更改为macOS
  • 代替导入UIKIT,导入基础 (如果您不尝试使用UIKit框架中的特定内容,这将起作用)
    也许一个优化编译器会将代码减少到:
    var count=100000000
    @Zaph尝试将此代码粘贴到游乐场,你就会明白我的意思。这个网站上疯狂的投票真的成了一个问题。很好的问题,谢谢你发帖。我建议你不要在操场上做这样的事情。我觉得苹果打算把操场作为测试小片段和想法的场所,而不是运行任何东西10亿次。由于代码在编辑时都是重新执行的,并且有值的实时显示等等,所以我真的看不出有人能够让它运行得足够快,可以做十亿次的事情,甚至是一些非常琐碎的事情。正如其他人所观察到的,优化编译器只会杀死你的循环,而Optimizers的许多其他功能会使游乐场的“实时视图”变得不可能。我使用游乐场不是为了衡量性能,而是为了进行一些计算。这个问题是有根据的
    func mmap<U>(_ transform: (Element, inout U?) -> ()) -> [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
        }
    }
    
    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)
        }
    }