为什么使用GCD的Swift CLI代码与不使用';不使用并发?

为什么使用GCD的Swift CLI代码与不使用';不使用并发?,swift,command-line-interface,swift3,grand-central-dispatch,Swift,Command Line Interface,Swift3,Grand Central Dispatch,因此,我在Swift 3中编写了一些代码作为CLI来练习使用Grand Central Dispatch 其思想是,有三个数组,每个数组填充100000000个值。然后我有一个函数将数组中的所有数字相加并打印出来。然后还有两个函数来计时这些数组的和。一个用于在每个数组上运行sum函数三次。另一个在每个数组上以其自己的异步方式运行sum函数(thread?,dispatch?,不确定此处使用哪个词) 代码如下: import Foundation func sum(array a: [Int])

因此,我在Swift 3中编写了一些代码作为CLI来练习使用Grand Central Dispatch

其思想是,有三个数组,每个数组填充100000000个值。然后我有一个函数将数组中的所有数字相加并打印出来。然后还有两个函数来计时这些数组的和。一个用于在每个数组上运行sum函数三次。另一个在每个数组上以其自己的异步方式运行sum函数(thread?,dispatch?,不确定此处使用哪个词) 代码如下:

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()
我很好奇为什么几乎是同一时间?
我认为并发编程使事情变得更快。我想我错过了一些重要的事情

您正在创建一个串行队列,这样您的“gcd”代码就不会利用多线程

更改:

let queue = DispatchQueue(label: "com.apple.queue")
致:

然后再次运行测试。您应该看到一个改进,因为对
async
的三个调用现在可以利用多线程

let queue = DispatchQueue(label: "com.apple.queue")
let queue = DispatchQueue(label: "com.apple.queue", attributes: .concurrent)