Swift vs Kotlin 在排序数组上的表现

Posted

技术标签:

【中文标题】Swift vs Kotlin 在排序数组上的表现【英文标题】:Swift vs Kotlin performance on sorting array 【发布时间】:2018-10-04 07:28:53 【问题描述】:

我尝试在 SwiftKotlin 中对大小为 100000000 的数组进行排序,我可以看到它们之间存在巨大的性能差距。对于这个数字,Kotlin 几乎比Swift18 倍(在我的机器上)。

我记录了一些结果,我发现 swift 在大小约为 10000 或更少时更快,但一旦数字增加,SwiftKotlin 相比变得明显慢。

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 在大小增加时变得非常缓慢,但在数量较小时速度会更快。

【问题讨论】:

你是如何运行 Swift 的?如果您在操场上运行它,请知道它被解释(不是很有效)并且在很多事情上都非常慢。 在我的 MacBook Pro 上将 100,000,000 个元素在发布配置中编译为 Xcode 项目(即进行优化)时大约需要 16 秒。 这里可能无关紧要,但请注意 Kotlin Int 对应于 Swift 中的 Int32 所以 Swift 现在比 Kotlin 快(最后一个问题已经没有意义了)。这不是让你的问题过时了吗? @Kamran 我认为您更新后的结果是合理的。现在有什么问题? 【参考方案1】:

由于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

这可能有助于某人在执行某种性能基准测试时检查Swift 生成配置中的release 结果,如上所示,结果在调试和发布配置中差异很大。

在调试和发布配置中,编译器使用不同的优化级别,因此会影响性能。关于优化级别的一些讨论可以在question 中找到

【讨论】:

以上是关于Swift vs Kotlin 在排序数组上的表现的主要内容,如果未能解决你的问题,请参考以下文章

Swift vs. Kotlin 漫谈系列之枚举

Kotlin 与 Swift 的简单对比,简直是太像了

如何在 KMM(kotlin 本机)共享模块中读取 Swift 框架库中生成的对象数组

swift 删除排序数组中的重复项

计数排序vs基数排序vs桶排序

在 Swift 中对协议数组进行排序?