#swift #command-line-interface #swift3 #grand-central-dispatch
#swift #интерфейс командной строки #swift3 #grand-central-dispatch
Вопрос:
Итак, я написал некоторый код в Swift 3 в качестве командной строки, чтобы попрактиковаться в использовании Grand Central Dispatch.
Идея в том, что есть три массива, каждый из которых заполнен значениями 100000000. Затем у меня есть функция для суммирования всех чисел массива и распечатки его. И затем есть еще две функции для вычисления суммы этих массивов по времени. Один для запуска функции sum три раза для каждого массива. Другой запускает функцию sum для каждого массива в своей собственной асинхронности (поток?, отправка?, не уверен, какое слово здесь использовать.) Вот код:
import Foundation
func sum(array a: [Int]) {
var suma = 0
for n in a {
suma = n
}
print(suma)
}
func gcd(a: [Int], b: [Int], c: [Int]) {
let queue = DispatchQueue(label: "com.apple.queue")
let group = DispatchGroup()
let methodStart = Date()
queue.async(group: group, execute: {
sum(array: a)
})
queue.async(group: group, execute: {
sum(array: b)
})
queue.async(group: group, execute: {
sum(array: c)
})
group.notify(queue: .main) {
let methodFinish = Date()
let executionTime = methodFinish.timeIntervalSince(methodStart)
print("GCD Exectuion Time: (executionTime)")
}
}
func non_gcd(a: [Int], b: [Int], c: [Int]) {
let methodStart = Date()
sum(array: a)
sum(array: b)
sum(array: c)
let methodFinish = Date()
let executionTime = methodFinish.timeIntervalSince(methodStart)
print("Non_GCD Exectuion Time: (executionTime)")
}
var a = [Int]()
var b = [Int]()
var c = [Int]()
// fill each array with 0 to 1 mil - 1
for i in 0..<100000000 {
a.append(i)
b.append(i 1)
c.append(i 2)
}
non_gcd(a: a, b: b, c: c)
gcd(a: a, b: b, c: c)
dispatchMain()
И вот результат, где вы можете видеть, что он выполняется примерно в то же время:
4999999950000000
5000000050000000
5000000150000000
Non_GCD Execution Time: 1.15053302049637
4999999950000000
5000000050000000
5000000150000000
GCD Execution Time: 1.16769099235535
Мне любопытно, почему это происходит почти в то же время?
Я думал, что параллельное программирование ускоряет работу. Я думаю, что я упускаю что-то важное.
Ответ №1:
Вы создаете последовательную очередь, поэтому ваш код «gcd» не использует никаких преимуществ многопоточности.
Изменить:
let queue = DispatchQueue(label: "com.apple.queue")
Для:
let queue = DispatchQueue(label: "com.apple.queue", attributes: .concurrent)
а затем снова запустите ваши тесты. Вы должны увидеть улучшение, поскольку три вызова async
теперь могут использовать преимущества многопоточности.