Почему мой код Swift CLI, использующий GCD, выполняется с той же скоростью, что и код, который не использует параллелизм?

#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 теперь могут использовать преимущества многопоточности.