当前位置: 首页 > 知识库问答 >
问题:

排序数组上的Swift与Kotlin性能

梁丘宏硕
2023-03-14

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

我记录了一些结果,发现当大小在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在大小增加时变得极其缓慢,尽管在数量较小时它会更快。

共有1个答案

公羊浩气
2023-03-14

正如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来获得您想