2

したがって、Grand Central Dispatchを使用して練習するCLIとしてSwift 3にいくつかのコードを書いています。GCDを使用するSwift CLIコードは、並行性を使用しないコードと同じ速度で実行されるのはなぜですか?

考えられるのは、それぞれが100000000の値で満たされた3つの配列があるということです。私は配列のすべての数を合計して出力する関数を持っています。そして、これらの配列の合計を時間測定する2つの関数がさらにあります。 1つは配列ごとに3回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 

私はなぜそれがほぼ同じ時間になっているのか興味がありますか? 私は、並行プログラミングが物事をより速くすると考えました。私は何か重要なものを見逃していると思う。

答えて

4

"gcd"コードがマルチスレッドを利用しないようにシリアルキューを作成しています。

変更:

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

へ:

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

、その後は再びテストを実行します。 asyncへの3回の呼び出しがマルチスレッドを利用できるようになったので、改善が見られるはずです。

+0

ありがとうございます! gcdコードが2倍速くなりました! – jped