【发布时间】:2017-04-26 15:01:09
【问题描述】:
我尝试使用大整数数组和大布尔数组执行埃拉托色尼筛算法。
整数版本的执行速度似乎比布尔版本快得多。这可能是什么原因?
import Foundation
var n : Int = 100000000;
var prime = [Bool](repeating: true, count: n+1)
var p = 2
let start = DispatchTime.now()
while((p*p)<=n)
{
if(prime[p] == true)
{
var i = p*2
while (i<=n)
{
prime[i] = false
i = i + p
}
}
p = p+1
}
let stop = DispatchTime.now()
let time = (Double)(stop.uptimeNanoseconds - start.uptimeNanoseconds) / 1000000.0
print("Time = \(time) ms")
布尔数组执行时间:78223.342295 ms
import Foundation
var n : Int = 100000000;
var prime = [Int](repeating: 1, count: n+1)
var p = 2
let start = DispatchTime.now()
while((p*p)<=n)
{
if(prime[p] == 1)
{
var i = p*2
while (i<=n)
{
prime[i] = 0
i = i + p
}
}
p = p+1
}
let stop = DispatchTime.now()
let time = (Double)(stop.uptimeNanoseconds - start.uptimeNanoseconds) / 1000000.0
print("Time = \(time) ms")
整数数组执行时间:8535.54546 ms
【问题讨论】:
-
这也许不相关,但你永远不应该说
if prime[p] == true。如果prime[p]是一个布尔值,它是一个条件:if prime[p]。 -
"这可能是什么原因?"为什么不让 Instruments 告诉你时间都花在了哪里呢?无需猜测(或要求我们为您做)。
-
请发布两个版本。
-
@shallowThought 我已经按照你的要求做了。
-
您是否在发布模式下编译了两个版本(带有优化)?在我的 iMac 上,它大约是 950 毫秒(布尔版本)与 1600 毫秒(整数版本)