Ios 快速执行速度
有没有办法提高操场的执行速度? 我想迭代许多循环,而不是等待10分钟 例如: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
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)
}
}