我尝试在swift
和kotlin
中排序一个大小为100000000的数组,我可以看到它们之间存在巨大的性能差距。对于这个数字,Kotlin
几乎比Swift
快18
倍(在我的机器上)。
我记录了一些结果,发现当大小在10000左右或更小时,swift的速度更快,但一旦数值上升,swift
就会变得比Kotlin
慢得多。
下面是Swift和Kotlin的代码,
迅捷
let n = 100000000
var arr = Array(repeating: 0, count: n)
for i in 1...n {
arr[i-1] = Int(arc4random_uniform(UInt32(n)))
}
//Record time before sort
arr.sort()
//Record time after sort
科特林
val n = 100000000
val arr = IntArray(n)
for (i in 1..n) {
arr[i-1] = Random().nextInt(n)
}
//Record time before sort
arr.sort()
//Record time after sort
下面是两个记录的时间,
迅捷
Size: 1000 Time: 0.001 sec
Size: 10000 Time: 0.009 - 0.01 sec
Size: 100000 Time: 0.122 - 0.127 sec
Size: 1000000 Time: 1.392 - 1.409 sec
Size: 10000000 Time: 16.115 - 16.569 sec
Size: 100000000 Time: 187.346 - 187.71 sec
Size: 1000000000 Waited more than 6 minutes and gave up!
Size: 1000 Time: 0.06 sec
Size: 10000 Time: 0.063 - 0.084 sec
Size: 100000 Time: 0.083 - 0.105 sec
Size: 1000000 Time: 0.23 - 0.501 sec
Size: 10000000 Time: 1.098 - 1.807 sec
Size: 100000000 Time: 10.759 - 11.141 sec
Size: 1000000000 Time: 124.252 - 127.54 sec
因此,在这里,您可以看到swift
在大小增加时变得极其缓慢,尽管在数量较小时它会更快。
正如MartinR强调要使用release
编译swift
的构建配置,所以我将其更改为release
,这样看来swift
对于任何数字都更快,如下结果所示,
Swift将构建配置作为发行版
Size: 1000 Time: 0.001 sec
Size: 10000 Time: 0.001 sec
Size: 100000 Time: 0.006 - 0.007 sec
Size: 1000000 Time: 0.076 - 0.081 sec
Size: 10000000 Time: 0.891 - 0.898 sec
Size: 100000000 Time: 9.01 - 10.14 sec
Size: 1000000000 Time: 113.87 - 117.285 sec
这对检查release
构建配置中的swift
结果可能很有帮助。在进行某种性能基准测试时,如上所示,调试和发布配置中的结果差别很大。
在调试和发布配置中,编译器使用不同的优化级别,从而影响性能。在这个问题中可以找到关于最优化水平的一些讨论
问题内容: 我在Swift Beta中实现一种算法,发现性能非常差。深入研究后,我意识到瓶颈之一就是对数组进行排序一样简单。相关部分在这里: 在C ++中,类似的操作在我的计算机上花费 0.06s 。 在Python中,它花费 0.6秒 ( 绝招 ,仅y =整数列表的sorted(x))。 在Swift中,如果使用以下命令进行编译,则需要 6s : 如果使用以下命令进行编译,则 最多 需要 88s
假设我只希望在生成的equals和hashCode实现中包含一个或两个字段(或者排除一个或多个字段)。对于简单类,例如: Groovy有以下特点: 龙目岛有: 静态编程语言中这样做的惯用方法是什么? 只是感觉不对。。。我真的不希望是可变的,而且额外的构造函数定义很难看。
问题内容: 在Swift 2.0中,您将如何按属性对自定义对象数组进行排序?我知道在Swift 1.2中,这是使用sorted()和sort()完成的。但是,这些方法在Xcode 7 beta 4中不再起作用。谢谢! 例如: 问题答案: 在Swift 2中: 您可以使用方法,使用来比较两个日期: 或者,如果您想对原始数组进行排序,则可以: 在Swift 3中 返回数组的排序形式,请使用,而不是 排
在处理接近排序的数组时,哪种算法的快速排序或合并排序性能更好?为什么?我意识到,在这种情况下,其他算法可能会比这些算法表现得更好。
问题内容: 假设我有一个自定义类的数组,每个类都包含一个名为 我还有一个任意值数组,称为,如下所示: 我的目标是对所有QB 进行排序,然后再对所有WR,RB和TE 进行排序。 我当前的操作方式是遍历中的每个元素,然后遍历所有播放器以附加到新数组。但是,我想不出一种更简单(更有效)的方法来做到这一点。非常感谢任何提示或指示。谢谢。 问题答案: 编辑: 我原来的方法是狗屎。这篇文章吸引了很多人的注意力
问题内容: 我想要这段代码的Swift版本: 问题答案: 更新:根据其他SO用户的建议提供解释。 与ObjC不同,在Swift中,您有sorted()(和sort())方法,该方法采用您提供的闭包,该闭包返回一个布尔值,以指示一个元素应该在另一个元素之前(true)还是在(false)之后。$ 0和$ 1是要比较的元素。我使用localizedCaseInsensitiveCompare来获得您想