我試圖加速一個進程,通過至少在兩個不同的內核上分配它來減慢我的主線程。與異步同步排隊時,代碼運行速度更快。它不應該是相反的嗎?
我認爲可以解決這個問題的原因是每個單獨的操作都是獨立的,只需要兩個點和一個浮點數。
但是,我的第一次刺戳是在執行queue.asnc
vs queue.sync
時運行速度明顯變慢,我不知道爲什麼!
這裏是同步運行
var block = UnsafeMutablePointer<Datas>.allocate(capacity: 0)
var outblock = UnsafeMutablePointer<Decimal>.allocate(capacity: 0)
func initialise()
{
outblock = UnsafeMutablePointer<Decimal>.allocate(capacity: testWith * 4 * 2)
block = UnsafeMutablePointer<Datas>.allocate(capacity: particles.count)
}
func update()
{
var i = 0
for part in particles
{
part.update()
let x1 = part.data.p1.x; let y1 = part.data.p1.y
let x2 = part.data.p2.x; let y2 = part.data.p2.x;
let w = part.data.size * rectScale
let w2 = part.data.size * rectScale
let dy = y2 - y1; let dx = x2 - x1
let length = sqrt(dy * dy + dx * dx)
let calcx = (-(y2 - y1)/length)
let calcy = ((x2 - x1)/length)
let calcx1 = calcx * w
let calcy1 = calcy * w
let calcx2 = calcx * w2
let calcy2 = calcy * w2
outblock[i] = x1 + calcx1
outblock[i+1] = y1 + calcy1
outblock[i+2] = x1 - calcx1
outblock[i+3] = y1 - calcy1
outblock[i+4] = x2 + calcx2
outblock[i+5] = y2 + calcy2
outblock[i+6] = x2 - calcx2
outblock[i+7] = y2 - calcy2
i += 8
}
}
下面的代碼是我在分配多個內核
let queue = DispatchQueue(label: "construction_worker_1", attributes: .concurrent)
let blocky = block
let oblocky = outblock
for i in 0..<particles.count
{
particles[i].update()
block[i] = particles[i].data//Copy the raw data into a thead safe format
queue.async {
let x1 = blocky[i].p1.x; let y1 = blocky[i].p1.y
let x2 = blocky[i].p2.x; let y2 = blocky[i].p2.x;
let w = blocky[i].size * rectScale
let w2 = blocky[i].size * rectScale
let dy = y2 - y1; let dx = x2 - x1
let length = sqrt(dy * dy + dx * dx)
let calcx = (-(y2 - y1)/length)
let calcy = ((x2 - x1)/length)
let calcx1 = calcx * w
let calcy1 = calcy * w
let calcx2 = calcx * w2
let calcy2 = calcy * w2
let writeIndex = i * 8
oblocky[writeIndex] = x1 + calcx1
oblocky[writeIndex+1] = y1 + calcy1
oblocky[writeIndex+2] = x1 - calcx1
oblocky[writeIndex+3] = y1 - calcy1
oblocky[writeIndex+4] = x2 + calcx2
oblocky[writeIndex+5] = y2 + calcy2
oblocky[writeIndex+6] = x2 - calcx2
oblocky[writeIndex+7] = y2 - calcy2
}
}
我真的不知道爲什麼這種放緩正在發生中的工作量嘗試!我使用的是UnsafeMutablePointer
,所以數據是線程安全的,我確保沒有變量可以同時被多個線程讀取或寫入。
這是怎麼回事?
小問題,但我沒有遵循'w'和'w2'的意圖。 'sqrt(dy * dy + dx * dx)'也可以替換爲'hypot(dy,dx)'。另外,我不確定你對'UnsafeMutablePointer'線程優於Swiftier的爭論,比如'Array'。數組在調試版本中遭受性能損失(但提供安全性和改進的內存管理,顯然,不安全的指針不能)。而在優化的發佈版本中,性能很好。 – Rob