有没有办法提高游乐场的执行速度?我想要迭代许多周期,而不是等待10分钟。
例如:
import UIKit
var count = 0
for var i = 0; i < 1000000000; i++ {
count++
}这段代码执行的时间太长了。但我想快速得到结果。
发布于 2017-11-29 07:17:48
最大的性能杀手之一是游乐场右侧的输出。现在,我将向您展示如何最小化此输出。
有关示例代码,请参阅末尾的。
最佳性能
性能最好的方法是将所有性能关键代码放在游乐场的Sources文件夹内的.swift文件中。
注意:为了使用Sources文件夹中的函数、类、属性和方法,您必须将它们标记为public。如果你想对一个类进行子类化,它必须被标记为open。
性能很好,但代码丑陋
下面的方法(我认为这不是官方的/预期的)可以用来禁用操场输出,但也会导致丑陋的代码。但是,它对于临时禁用输出是有好处的。
有两种主要方法(和两个技巧)可以实现最少的输出量(如果您找到更好的方法,请告诉我们):
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
()之上或之下添加额外的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))
然而,这可能会导致缩进灾难……
(我没有找到如何删除输出的方法;下面的列表可能不完整):
returns in functions和closuresOptional variables,例如:var x: Int?Sequence上新的map方法的一个示例
用法:见上文第3点。
Sequence.map的签名是
func map<T>(_ transform: (Self.Element) throws -> T) rethrows -> [T]因为我还没有找到一种方法来删除返回值的输出,所以可以使用带有inout参数的闭包(通过赋值获得“return”值)。然后,可能的签名可以是:
func mmap<U>(_ transform: (Element, inout U?) -> ()) -> [U]因此,我们可以在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
}
}您的示例代码
使用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次循环迭代!
发布于 2016-01-31 04:13:41
我能感受到你的痛苦,我只是在把2D函数打印到[Double],然后再转换成UIImageView。其中一个步骤是对数百万像素进行迭代,这将耗费很长时间。
任何计算密集、重复或可能耗时的东西都应该放在游乐场的"Sources“文件夹中。这样,代码在游乐场运行之前就被预编译了。将该for循环的输出放入可从操场调用的公共函数中。这样,您就不必坐在那里观察游乐场在for循环中的所有次数。
发布于 2017-03-16 04:55:56
我有一个这样的问题,经过几天的试验,我已经解决了它。我所需要做的就是将我所有的代码移动到playground的Sources文件夹中。因此,在此之后,执行速度得到了提高。我希望它能对你有所帮助。
注意:不要忘记使用开放类。
https://stackoverflow.com/questions/26073192
复制相似问题