Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ConcurrencyWithGCD

Takanori Hirobe
September 06, 2020

 ConcurrencyWithGCD

近年のモバイルデバイスのプロセッサはマルチコア化が進んでおり、iOSデバイスも例外ではありません。たとえば、最新のiPhoneには6つのコアが搭載されています。

今後もコアが増えていくことは確実で、iOSエンジニアである私たちにとって多くのコアを活かすための知見はますます重要になっています。

そこで、このトークではGrand Central DispatchとSwiftを使ってソートや探索といった基本的なアルゴリズムを並行化する手法を学び、コアをもっと有効に使うための考え方を説明します。

このトークを観て、Grand Central Dispatchを使ったマルチスレッドプログラミングの新たな可能性に触れてみましょう。

Takanori Hirobe

September 06, 2020
Tweet

More Decks by Takanori Hirobe

Other Decks in Programming

Transcript

  1. Takanori Hirobe
    Grand Central DispatchʹΑΔ

    ฒߦΞϧΰϦζϜೖ໳
    iOSDC JAPAN 2020

    View Slide

  2. ࣗݾ঺հ
    • ኍ෦ وಙ( Takanori Hirobe )

    • Twitter, Github, Qiita: @taka1068

    View Slide

  3. ࣗݾ঺հ
    • ኍ෦ وಙ( Takanori Hirobe )

    • Twitter, Github, Qiita: @taka1068

    • ϑΣϯϦϧגࣜձࣾॴଐ

    View Slide

  4. ࣗݾ঺հ
    • ኍ෦ وಙ( Takanori Hirobe )

    • Twitter, Github, Qiita: @taka1068

    • ϑΣϯϦϧגࣜձࣾॴଐ
    ϓϥνφεϙϯαʔ

    View Slide

  5. ࢿྉʹ͍ͭͯ
    ϋογϡλά෇͖ͰπΠʔτ͠·͢
    • εϥΠυpdf

    • https://speakerdeck.com/taka1068/concurrencywithgcd



    • શαϯϓϧίʔυ

    • https://github.com/taka1068/iOSDC-2020-demo

    View Slide

  6. ΞδΣϯμ
    • ࠷ۙͷiOSσόΠεͱϚϧνίΞԽʹؔ͢Δ՝୊

    • for loopΛฒߦԽ͢Δ

    • ΫΠοΫιʔτΛฒߦԽ͢Δ

    • ͍Ζ͍ΖͳΦʔόʔϔου

    View Slide

  7. ΞδΣϯμ
    • ࠷ۙͷiOSσόΠεͱϚϧνίΞԽʹؔ͢Δ՝୊
    • for loopΛฒߦԽ͢Δ

    • ΫΠοΫιʔτΛฒߦԽ͢Δ

    • ͍Ζ͍ΖͳΦʔόʔϔου

    View Slide

  8. ࠷ۙͷiOSσόΠεͱϚϧνίΞ
    • iPhone 11

    • 6 ίΞ

    • iPad Pro

    • 8 ίΞ

    View Slide

  9. ࠷ۙͷiOSσόΠεͱϚϧνίΞ
    • iPhone 11

    • 6 ίΞ

    • iPad Pro

    • 8 ίΞ

    • Mac Pro

    • ࠷େ28 ίΞ

    View Slide

  10. • ࠓޙ΋ϚϧνίΞԽ͕ਐΉ͜ͱ͸࣮֬

    • iOSΤϯδχΞʹͱͬͯɺϚϧνίΞΛ׆͔͢஌ݟ΋ॏཁʹͳͬͯ͘Δ͸ͣ

    View Slide


  11. • ࠓޙ΋ϚϧνίΞԽ͕ਐΉ͜ͱ͸࣮֬

    • iOSΤϯδχΞʹͱͬͯɺϚϧνίΞΛ׆͔͢஌ݟ΋ॏཁʹͳͬͯ͘Δ͸ͣ

    View Slide

  12. Grand Central Dispatch

    View Slide

  13. Grand Central Dispatch
    • Apple७ਖ਼ͷϑϨʔϜϫʔΫ

    • Swift΍Xcodeͱͷ਌࿨ੑ͕ߴ͍

    • watchOS͔ΒmacOS·Ͱ࢖͑Δ

    • pthreadͳͲͱൺ΂Δͱ࢖͍΍͍͢

    View Slide

  14. DispatchQueue.main.async {} ͔͠࢖ͬͨ͜ͱͳ͍

    ϚϧνεϨου͸ͳΜͱͳۤ͘ख

    View Slide

  15. Grand Central Dispatchʹ਌͠΋͏

    View Slide

  16. Grand Central Dispatchʹ਌͠΋͏
    • Grand Central DispatchΛ࢖ͬͨฒߦΞϧΰϦζϜʹೖ໳

    View Slide

  17. ฒߦΞϧΰϦζϜͱ͸
    • ΞϧΰϦζϜͷ֤෦෼Λฒߦʹॲཧ͢ΔΞϧΰϦζϜ

    View Slide

  18. ฒߦΞϧΰϦζϜͱ͸
    • ΞϧΰϦζϜͷ֤෦෼Λฒߦʹॲཧ͢ΔΞϧΰϦζϜ

    View Slide

  19. ฒߦΞϧΰϦζϜͷ۩ମྫ

    View Slide

  20. ΞδΣϯμ
    • ࠷ۙͷiOSσόΠεͱϚϧνίΞԽʹؔ͢Δ՝୊

    • for loopΛฒߦԽ͢Δ
    • ΫΠοΫιʔτΛฒߦԽ͢Δ

    • ͍Ζ͍ΖͳΦʔόʔϔου

    View Slide

  21. ՝୊
    • Stringͷ഑ྻͷ .count ͷ߹ܭΛܭࢉ͍ͨ͠

    View Slide

  22. ՝୊
    • Stringͷ഑ྻͷ .count ͷ߹ܭΛܭࢉ͍ͨ͠

    View Slide

  23. ՝୊
    • Stringͷ഑ྻͷ .count ͷ߹ܭΛܭࢉ͍ͨ͠
    36͔ࠃޠͷѫࡰ

    View Slide

  24. ՝୊
    • Stringͷ഑ྻͷ .count ͷ߹ܭΛܭࢉ͍ͨ͠

    View Slide

  25. ՝୊
    • Stringͷ഑ྻͷ .count ͷ߹ܭΛܭࢉ͍ͨ͠

    View Slide

  26. ՝୊
    • Stringͷ഑ྻͷ .count ͷ߹ܭΛܭࢉ͍ͨ͠
    map Λฒߦॲཧ͍ͨ͠

    View Slide

  27. Grand Central DispatchΛ࢖͑͹
    ؆୯ʹॻ͚Δ

    View Slide

  28. https://developer.apple.com/documentation/dispatch/dispatchqueue/2016088-concurrentperform

    View Slide

  29. View Slide

  30. ΫϩʔδϟࣜΛฒߦॲཧ

    View Slide

  31. doSomething(0),
    doSomething(1),
    ...,
    doSomething(9)
    ͕ฒߦͰॲཧ͞ΕΔ

    View Slide

  32. • DispatchQueue.concurrentPerform ͸forจͷฒߦॲཧ൛ͱݴ͑Δ

    View Slide

  33. • DispatchQueue.concurrentPerform ͸forจͷฒߦॲཧ൛ͱݴ͑Δ

    • forจ͕͋Ε͹mapΛॻ͘ͷ͸؆୯

    View Slide

  34. SwiftͱGrandCentralDispatchͰ
    ฒߦmapΛॻ͍ͯΈΔ

    View Slide

  35. View Slide

  36. View Slide

  37. nil ͰॳظԽ͓ͯ͘͠

    View Slide

  38. ͜ͷ෦෼͕ฒྻॲཧ͞ΕΔ

    View Slide

  39. View Slide

  40. View Slide

  41. View Slide

  42. unwrap ͯ͠ return

    View Slide

  43. View Slide

  44. ෳ਺εϨου͔Βॻ͖ࠐΈ

    View Slide

  45. ෳ਺εϨου͔Βॻ͖ࠐΈ
    ΫϥογϡͷՄೳੑ͕͋Δ

    View Slide

  46. View Slide

  47. γϦΞϧͳDispatchQueue

    View Slide

  48. γϦΞϧͳDispatchQueue
    ෳ਺εϨου͔Βͷಉ࣌ΞΫηεΛ๷͙

    View Slide

  49. View Slide

  50. ϕϯνϚʔΫ

    View Slide

  51. ϕϯνϚʔΫ
    • 36ϲࠃޠͷѫࡰͷcountΛ߹ܭ

    View Slide

  52. ϕϯνϚʔΫ
    • 36ϲࠃޠͷѫࡰͷcountΛ߹ܭ
    - 5ճଌఆͨ͠ฏۉ஋Ͱ͢ɻ

    - εϥΠυʹ৐ͤͨίʔυ͸આ໌༻Ͱ͢ɻ࣮ࡍʹଌఆʹར༻ͨ͠ίʔυ͸Githubʹ͋Γ·͢ɻ

    - MacBook Pro 15-inch, 2018, Core i9 2.9 GHz.

    - macOS Catalina 10.15.6, Swift 5.2.4, ࠷దԽ͋Γ ( -O )
    Array.map concurrentMap
    0.00024 seconds 0.00064 seconds

    View Slide

  53. ϕϯνϚʔΫ
    • 36ϲࠃޠͷѫࡰͷcountΛ߹ܭ
    - 5ճଌఆͨ͠ฏۉ஋Ͱ͢ɻ

    - εϥΠυʹ৐ͤͨίʔυ͸આ໌༻Ͱ͢ɻ࣮ࡍʹଌఆʹར༻ͨ͠ίʔυ͸Githubʹ͋Γ·͢ɻ

    - MacBook Pro 15-inch, 2018, Core i9 2.9 GHz.

    - macOS Catalina 10.15.6, Swift 5.2.4, ࠷దԽ͋Γ ( -O )
    Array.map concurrentMap
    0.00024 seconds 0.00064 seconds
    0 sec
    0.001 sec
    Array.map concurrentMap

    View Slide

  54. ϕϯνϚʔΫ
    • 36ϲࠃޠͷѫࡰͷcountΛ߹ܭ

    • ฒߦԽͨ͠ͷʹ஗͘ͳ͍ͬͯΔ
    - 5ճଌఆͨ͠ฏۉ஋Ͱ͢ɻ

    - εϥΠυʹ৐ͤͨίʔυ͸આ໌༻Ͱ͢ɻ࣮ࡍʹଌఆʹར༻ͨ͠ίʔυ͸Githubʹ͋Γ·͢ɻ

    - MacBook Pro 15-inch, 2018, Core i9 2.9 GHz.

    - macOS Catalina 10.15.6, Swift 5.2.4, ࠷దԽ͋Γ ( -O )
    Array.map concurrentMap
    0.00024 seconds 0.00064 seconds
    0 sec
    0.001 sec
    Array.map concurrentMap

    View Slide

  55. ͳͥ஗͘ͳͬͨͷ͔
    • ѫࡰఔ౓ͷจࣈ਺Χ΢ϯτͳΒॠ࣌ʹܭࢉͰ͖Δ

    • Ή͠ΖΦʔόʔϔουͰੑೳ͕མ͍ͪͯΔ

    View Slide

  56. ͳͥ஗͘ͳͬͨͷ͔
    • ѫࡰఔ౓ͷจࣈ਺Χ΢ϯτͳΒॠ࣌ʹܭࢉͰ͖Δ

    • Ή͠ΖΦʔόʔϔουͰੑೳ͕མ͍ͪͯΔ
    γϦΞϧͳQueueʹΑΔɺෳ਺εϨου͔Βͷॻ͖ࠐΈʹର͢Δอޢ

    View Slide

  57. ݁Ռͷॻ͖ࠐΈ͸ҰͭͷεϨουͷΈ

    View Slide

  58. ݁Ռͷॻ͖ࠐΈ͸ҰͭͷεϨουͷΈ
    Φʔόʔϔου

    View Slide

  59. ίΞ0 ίΞ1 ίΞ2 ίΞ3
    .count .count .count .count
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    Overhead
    Overhead
    Overhead
    .count
    .count
    .count
    .count
    Overhead
    ഑ྻ΁ͷ୅ೖ
    Overhead
    Overhead
    ࣌ؒ

    View Slide

  60. ίΞ0 ίΞ1 ίΞ2 ίΞ3
    .count .count .count .count
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    Overhead
    Overhead
    Overhead
    .count
    .count
    .count
    .count
    Overhead
    ഑ྻ΁ͷ୅ೖ
    Overhead
    Overhead
    ͋ΔॠؒͰͷ഑ྻ΁ͷ୅ೖ͸ɺ

    1ͭͷεϨου͔͠ڐ͞Εͳ͍
    ࣌ؒ

    View Slide

  61. ίΞ0 ίΞ1 ίΞ2 ίΞ3
    .count .count .count .count
    Overhead
    Overhead
    Overhead
    .count
    .count
    .count
    Overhead
    Overhead
    Overhead
    ͋ΔॠؒͰͷ഑ྻ΁ͷ୅ೖ͸ɺ

    1ͭͷεϨου͔͠ڐ͞Εͳ͍
    ࣌ؒ
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    .count
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ

    View Slide

  62. ίΞ0 ίΞ1 ίΞ2 ίΞ3
    .count .count .count .count
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    Overhead
    Overhead
    Overhead
    .count
    .count
    .count
    .count
    Overhead
    ഑ྻ΁ͷ୅ೖ
    Overhead
    Overhead
    ଞͷεϨου͕ॻ͖ࠐΜͰ͍Δ࣌ɺ

    ͦΕ͕ऴΘΔ·Ͱ଴ͭඞཁ͕͋Δ
    ࣌ؒ

    View Slide

  63. ίΞ0 ίΞ1 ίΞ2 ίΞ3
    .count .count .count .count
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    Overhead
    Overhead
    Overhead
    .count
    .count
    .count
    .count
    Overhead
    ഑ྻ΁ͷ୅ೖ
    Overhead
    Overhead
    ଞͷεϨου͕ॻ͖ࠐΜͰ͍Δ࣌ɺ

    ͦΕ͕ऴΘΔ·Ͱ଴ͭඞཁ͕͋Δ
    ଴ͪ࣌ؒ: Φʔόʔϔου
    ࣌ؒ

    View Slide

  64. ίΞ0 ίΞ1 ίΞ2 ίΞ3
    .count .count .count .count
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    Overhead
    Overhead
    Overhead
    .count
    .count
    .count
    .count
    Overhead
    ഑ྻ΁ͷ୅ೖ
    Overhead
    Overhead
    ଞͷεϨου͕ॻ͖ࠐΜͰ͍Δ࣌ɺ

    ͦΕ͕ऴΘΔ·Ͱ଴ͭඞཁ͕͋Δ
    ଴ͪ࣌ؒ: Φʔόʔϔου
    ࣌ؒ

    View Slide

  65. ίΞ0 ίΞ1 ίΞ2 ίΞ3
    .count .count .count .count
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    Overhead
    Overhead
    Overhead
    .count
    .count
    .count
    .count
    Overhead
    ഑ྻ΁ͷ୅ೖ
    Overhead
    Overhead
    ฒߦԽͷԸܙΑΓ

    Φʔόʔϔουͷํ͕ϖφϧςΟ͕େ͖͍
    ࣌ؒ

    View Slide

  66. ίΞ0 ίΞ1 ίΞ2 ίΞ3
    .count .count .count .count
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    Overhead
    Overhead
    Overhead
    .count
    .count
    .count
    .count
    Overhead
    ഑ྻ΁ͷ୅ೖ
    Overhead
    Overhead
    <
    Ըܙ ϖφϧςΟ
    ࣌ؒ

    View Slide

  67. ίΞ0 ίΞ1 ίΞ2 ίΞ3
    .count .count .count .count
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    Overhead
    Overhead
    Overhead
    .count
    .count
    .count
    .count
    Overhead
    ഑ྻ΁ͷ୅ೖ
    Overhead
    Overhead
    ҰͭҰͭͷλεΫ
    ͕খ͗͢͞Δ
    ࣌ؒ

    View Slide

  68. ίΞ0 ίΞ1 ίΞ2 ίΞ3
    λεΫ λεΫ λεΫ λεΫ
    Overhead
    Overhead
    Overhead
    λεΫ
    λεΫ
    λεΫ
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    λεΫ
    ࣌ؒ

    View Slide

  69. ίΞ0 ίΞ1 ίΞ2 ίΞ3
    λεΫ λεΫ λεΫ λεΫ
    Overhead
    Overhead
    Overhead
    λεΫ
    λεΫ
    λεΫ
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    ഑ྻ΁ͷ୅ೖ
    λεΫ
    >
    Ըܙ ϖφϧςΟ
    Φʔόʔϔουͷ઎ΊΔׂ߹ΛݮΒ͢
    ࣌ؒ

    View Slide

  70. ॏ͍ॲཧͰϕϯνϚʔΫ

    View Slide

  71. ॏ͍ॲཧͰϕϯνϚʔΫ
    • Ն໨ᕸੴͷʮ͜͜Ζʯͷ๯಄ͷ 57631 จࣈ͔Β׽ࣈͷݸ਺ΛΧ΢ϯτ

    • ഑ྻͷཁૉʹ͸1ஈམΛ·Δ͝ͱೖΕͯܭଌ

    View Slide

  72. View Slide

  73. View Slide

  74. ॏ͍ॲཧͰϕϯνϚʔΫ
    • Ն໨ᕸੴͷʮ͜͜Ζʯͷ๯಄ͷ 57631 จࣈ͔Β׽ࣈͷݸ਺ΛΧ΢ϯτ

    • ഑ྻͷཁૉʹ͸1ஈམΛ·Δ͝ͱೖΕͯܭଌ

    View Slide

  75. ॏ͍ॲཧͰϕϯνϚʔΫ
    • Ն໨ᕸੴͷʮ͜͜Ζʯͷ๯಄ͷ 57631 จࣈ͔Β׽ࣈͷݸ਺ΛΧ΢ϯτ

    • ഑ྻͷཁૉʹ͸1ஈམΛ·Δ͝ͱೖΕͯܭଌ
    - 5ճଌఆͨ͠ฏۉ஋Ͱ͢ɻ

    - εϥΠυʹ৐ͤͨίʔυ͸આ໌༻Ͱ͢ɻ

    ࣮ࡍʹଌఆʹར༻ͨ͠ίʔυ͸Githubʹ͋Γ·͢ɻ

    - MacBook Pro 15-inch, 2018, Core i9 2.9 GHz.

    - macOS Catalina 10.15.6, Swift 5.2.4, ࠷దԽ͋Γ ( -O )
    Array.map concurrentMap
    0.0082 seconds 0.0047 seconds

    View Slide

  76. ॏ͍ॲཧͰϕϯνϚʔΫ
    • Ն໨ᕸੴͷʮ͜͜Ζʯͷ๯಄ͷ 57631 จࣈ͔Β׽ࣈͷݸ਺ΛΧ΢ϯτ

    • ഑ྻͷཁૉʹ͸1ஈམΛ·Δ͝ͱೖΕͯܭଌ
    - 5ճଌఆͨ͠ฏۉ஋Ͱ͢ɻ

    - εϥΠυʹ৐ͤͨίʔυ͸આ໌༻Ͱ͢ɻ

    ࣮ࡍʹଌఆʹར༻ͨ͠ίʔυ͸Githubʹ͋Γ·͢ɻ

    - MacBook Pro 15-inch, 2018, Core i9 2.9 GHz.

    - macOS Catalina 10.15.6, Swift 5.2.4, ࠷దԽ͋Γ ( -O )
    Array.map concurrentMap
    0.0082 seconds 0.0047 seconds
    0 sec
    0.01 sec
    Array.map concurrentMap

    View Slide

  77. ஫ҙ఺
    ฒߦԽ͸ສೳͰ͸ͳ͍
    • े෼ʹॏ͍ॲཧΛฒߦԽ͠ͳ͍ͱҙຯ͕ͳ͍ɻ

    • ฒߦԽͷԸܙ͕ɺΦʔόʔϔουʹΑΔϖφϧςΟΛ্ճΔඞཁ͕͋Δɻ

    View Slide

  78. ஫ҙ఺
    ฒߦԽ͸ສೳͰ͸ͳ͍
    • े෼ʹॏ͍ॲཧΛฒߦԽ͠ͳ͍ͱҙຯ͕ͳ͍ɻ

    • ฒߦԽͷԸܙ͕ɺΦʔόʔϔουʹΑΔϖφϧςΟΛ্ճΔඞཁ͕͋Δɻ

    • ฒߦԽͷԸܙΛड͚ΒΕΔΑ͏ʹλεΫΛׂΓৼΔඞཁ͕͋Δɻ

    View Slide

  79. ͳʹ͕ѱ͔ͬͨͷ͔
    ࠷ॳͷྫʹ໭Δ

    View Slide

  80. ͳʹ͕ѱ͔ͬͨͷ͔
    ࠷ॳͷྫʹ໭Δ
    • ҰͭҰͭͷλεΫ(഑ྻͷཁૉ͕ࡉ੾Εʹͳ͍ͬͯΔ)

    View Slide

  81. ͳʹ͕ѱ͔ͬͨͷ͔
    ࠷ॳͷྫʹ໭Δ
    • ҰͭҰͭͷλεΫ(഑ྻͷཁૉ͕ࡉ੾Εʹͳ͍ͬͯΔ)

    • ຊ౰ʹ΍Γ͍ͨλεΫΑΓΦʔόʔϔουʹ࣌ؒΛඅ΍ͯ͠͠·ͬͨ

    View Slide

  82. ͜͜·Ͱͷ·ͱΊ
    • DispatchQueue.concurrentPerform͸forจͷฒߦॲཧ൛

    • ฒߦԽʹͱ΋ͳ͍ɺಛผͳέΞ͕ඞཁʹͳΔ͜ͱ͕͋Δ

    View Slide

  83. ͜͜·Ͱͷ·ͱΊ
    • DispatchQueue.concurrentPerform͸forจͷฒߦॲཧ൛

    • ฒߦԽʹͱ΋ͳ͍ɺಛผͳέΞ͕ඞཁʹͳΔ͜ͱ͕͋Δ

    • CPUͷίΞ͕ຊ౰ʹ΍Γ͍ͨ͜ͱʹ࣌ؒΛඅ΍ͤΔΑ͏ʹ͓હཱͯͯ͋͛͠
    Δͷ͕๻ͨͪͷ࢓ࣄ

    View Slide

  84. ΞδΣϯμ
    • ࠷ۙͷiOSσόΠεͱϚϧνίΞԽʹؔ͢Δ՝୊

    • for loopΛฒߦԽ͢Δ

    • ΫΠοΫιʔτΛฒߦԽ͢Δ
    • ͍Ζ͍ΖͳΦʔόʔϔου

    View Slide

  85. ΫΠοΫιʔτ

    View Slide

  86. array
    0 14
    1 2 3 4 5 6 7 8 9 10 11 12 13
    59 75 92
    99 77 15 13 2 68 31 83 35 67 51 70

    View Slide

  87. array
    0 14
    1 2 3 4 5 6 7 8 9 10 11 12 13
    59 75 92
    99 77 15 13 2 68 31 83 35 67 51 70
    pivot

    View Slide

  88. array
    0 14
    1 2 3 4 5 6 7 8 9 10 11 12 13
    59 75 92
    99 77 15 13 2 68 31 83 35 67 51 70
    array
    0 14
    1 2 3 4 5 6 7 8 9 10 11 12 13
    15 13 92
    2 31 35 51 59 75 99 77 68 83 67 70
    Partition

    View Slide

  89. array
    0 14
    1 2 3 4 5 6 7 8 9 10 11 12 13
    59 75 92
    99 77 15 13 2 68 31 83 35 67 51 70
    array
    0 14
    1 2 3 4 5 6 7 8 9 10 11 12 13
    15 13 92
    2 31 35 51 59 75 99 77 68 83 67 70
    <= 59
    Partition

    View Slide

  90. array
    0 14
    1 2 3 4 5 6 7 8 9 10 11 12 13
    59 75 92
    99 77 15 13 2 68 31 83 35 67 51 70
    array
    0 14
    1 2 3 4 5 6 7 8 9 10 11 12 13
    15 13 92
    2 31 35 51 59 75 99 77 68 83 67 70
    <= 59 59 <
    Partition

    View Slide

  91. array
    0 1 2 3 4 5
    15 13 2 31 35 51
    14
    7 8 9 10 11 12 13
    92
    75 99 77 68 83 67 70

    View Slide

  92. array
    0 1 2 3 4 5
    15 13 2 31 35 51
    14
    7 8 9 10 11 12 13
    92
    75 99 77 68 83 67 70
    pivot
    pivot

    View Slide

  93. array
    0 1 2 3 4 5
    15 13 2 31 35 51
    Partition
    14
    7 8 9 10 11 12 13
    92
    75 99 77 68 83 67 70
    Partition

    View Slide

  94. array
    0 1 2 3 4 5
    15 13 2 31 35 51
    Partition
    array
    0 1 2 3 4 5
    2 13 15 31 35 51
    14
    7 8 9 10 11 12 13
    92
    75 99 77 68 83 67 70
    Partition
    14
    7 8 9 10 11 12 13
    99
    67 68 70 75 77 83 92

    View Slide

  95. array
    0 1 2 3 4 5
    15 13 2 31 35 51
    Partition
    array
    0 1 2 3 4 5
    2 13 15 31 35 51
    14
    7 8 9 10 11 12 13
    92
    75 99 77 68 83 67 70
    Partition
    14
    7 8 9 10 11 12 13
    99
    67 68 70 75 77 83 92

    View Slide

  96. 59 99
    75 92 15 13 2 31 35
    68 83 67 51 70 77
    a
    0 14
    1 2 3 4 5 6 7 8 9 10 11 12 13
    15 2
    13 31 35 51 59 99 35
    75 83 67 51 70 77
    a
    0 14
    1 2 3 4 5 6 7 8 9 10 11 12 13
    2 15
    13 31 35 51
    a
    0 1 2 3 4 5
    68 75
    67 70 92 83 77 99
    14
    7 8 9 10 11 12 13
    a
    2 13
    a
    0 1
    31 35 51
    3 4 5
    35 51
    4 5
    51
    5
    13
    1
    68
    67 70
    7 8 9
    68 70
    8 9
    70
    9
    83 77 92 99
    14
    11 12 13
    99
    14
    77 83
    11 12
    83
    12

    View Slide

  97. 59 99
    75 92 15 13 2 31 35
    68 83 67 51 70 77
    a
    0 14
    1 2 3 4 5 6 7 8 9 10 11 12 13
    15 2
    13 31 35 51 99 35
    75 83 67 51 70 77
    a
    0 14
    1 2 3 4 5 6 7 8 9 10 11 12 13
    2 13 31 35 51
    a
    0 1 2 3 4 5
    68
    67 70 92 83 77 99
    14
    7 8 9 10 11 12 13
    a
    13
    a
    0 1
    35 51
    3 4 5
    51
    4 5
    5
    1
    68 70
    7 8 9
    70
    8 9
    9
    83 77 99
    14
    11 12 13
    14
    83
    11 12
    12
    59
    15 75
    2 31
    35
    51
    13
    67
    68
    70
    92
    99
    77
    83

    View Slide

  98. 59
    15 75
    2 31
    35
    51
    13
    67
    68
    70
    92
    99
    77
    83

    View Slide

  99. 59
    15 75
    2 31 35 51
    13 67 68 70 92 99
    77 83

    View Slide

  100. ΫΠοΫιʔτͷΞϧΰϦζϜ

    View Slide

  101. ΫΠοΫιʔτͷΞϧΰϦζϜ
    array
    0 1 2 3 4 5 6 7
    5 2 1 4 6 8 7 3

    View Slide

  102. ΫΠοΫιʔτͷΞϧΰϦζϜ
    1. ϐϘοτΛબͼ
    array
    0 1 2 3 4 5 6 7
    5 2 1 4 6 8 7 3

    View Slide

  103. ΫΠοΫιʔτͷΞϧΰϦζϜ
    1. ϐϘοτΛબͼ

    2. ഑ྻΛϐϘοτҎԼͷ෦෼ͱϐϘοτΑΓେ͖͍෦෼ͱʹ෼͚Δ
    array
    0 1 2 3 4 5 6 7
    2 1 4 3 5 8 7 6

    View Slide

  104. ΫΠοΫιʔτͷΞϧΰϦζϜ
    1. ϐϘοτΛબͼ

    2. ഑ྻΛϐϘοτҎԼͷ෦෼ͱϐϘοτΑΓେ͖͍෦෼ͱʹ෼͚Δ
    array
    0 1 2 3 4 5 6 7
    2 1 4 3 5 8 7 6
    ύʔςΟγϣϯͱ΋ݺͿ

    View Slide

  105. ΫΠοΫιʔτͷΞϧΰϦζϜ
    1. ϐϘοτΛબͼ

    2. ഑ྻΛϐϘοτҎԼͷ෦෼ͱϐϘοτΑΓେ͖͍෦෼ͱʹ෼͚Δ
    array
    0 1 2 3 4 5 6 7
    2 1 4 3 5 8 7 6

    View Slide

  106. ΫΠοΫιʔτͷΞϧΰϦζϜ
    1. ϐϘοτΛબͼ

    2. ഑ྻΛϐϘοτҎԼͷ෦෼ͱϐϘοτΑΓେ͖͍෦෼ͱʹ෼͚Δ
    array
    0 1 2 3 4 5 6 7
    2 1 4 3 5 8 7 6

    View Slide

  107. ΫΠοΫιʔτͷΞϧΰϦζϜ
    1. ϐϘοτΛબͼ

    2. ഑ྻΛϐϘοτҎԼͷ෦෼ͱϐϘοτΑΓେ͖͍෦෼ͱʹ෼͚Δ

    3. ϐϘοτҎԼͷ෦෼ʹ1, 2Λ܁Γฦ͢
    array
    0 1 2 3 4 5 6 7
    2 1 4 3 5 8 7 6
    array
    0 1 2 3
    2 1 4 3

    View Slide

  108. ΫΠοΫιʔτͷΞϧΰϦζϜ
    1. ϐϘοτΛબͼ

    2. ഑ྻΛϐϘοτҎԼͷ෦෼ͱϐϘοτΑΓେ͖͍෦෼ͱʹ෼͚Δ

    3. ϐϘοτҎԼͷ෦෼ʹ1, 2Λ܁Γฦ͢
    array
    0 1 2 3 4 5 6 7
    2 1 4 3 5 8 7 6
    array
    0 1 2 3
    2 1 4 3

    View Slide

  109. ΫΠοΫιʔτͷΞϧΰϦζϜ
    1. ϐϘοτΛબͼ

    2. ഑ྻΛϐϘοτҎԼͷ෦෼ͱϐϘοτΑΓେ͖͍෦෼ͱʹ෼͚Δ

    3. ϐϘοτҎԼͷ෦෼ʹ1, 2Λ܁Γฦ͢
    array
    0 1 2 3 4 5 6 7
    2 1 4 3 5 8 7 6
    array
    0 1 2 3
    2 1 4 3

    View Slide

  110. ΫΠοΫιʔτͷΞϧΰϦζϜ
    1. ϐϘοτΛબͼ

    2. ഑ྻΛϐϘοτҎԼͷ෦෼ͱϐϘοτΑΓେ͖͍෦෼ͱʹ෼͚Δ

    3. ϐϘοτҎԼͷ෦෼ʹ1, 2Λ܁Γฦ͢
    array
    0 1 2 3 4 5 6 7
    2 1 4 3 5 8 7 6
    array
    0 1 2 3
    1 2 4 3

    View Slide

  111. ΫΠοΫιʔτͷΞϧΰϦζϜ
    1. ϐϘοτΛબͼ

    2. ഑ྻΛϐϘοτҎԼͷ෦෼ͱϐϘοτΑΓେ͖͍෦෼ͱʹ෼͚Δ

    3. ϐϘοτҎԼͷ෦෼ʹ1, 2Λ܁Γฦ͢

    4. ϐϘοτΑΓେ͖͍෦෼ʹ1, 2Λ܁Γฦ͢
    array
    0 1 2 3 4 5 6 7
    2 1 4 3 5 8 7 6
    array
    0 1 2 3
    1 2 4 3 array
    5 6 7
    8 7 6

    View Slide

  112. ΫΠοΫιʔτͷΞϧΰϦζϜ
    1. ϐϘοτΛબͼ

    2. ഑ྻΛϐϘοτҎԼͷ෦෼ͱϐϘοτΑΓେ͖͍෦෼ͱʹ෼͚Δ

    3. ϐϘοτҎԼͷ෦෼ʹ1, 2Λ܁Γฦ͢

    4. ϐϘοτΑΓେ͖͍෦෼ʹ1, 2Λ܁Γฦ͢
    array
    0 1 2 3 4 5 6 7
    2 1 4 3 5 8 7 6
    array
    0 1 2 3
    1 2 4 3 array
    5 6 7
    8 7 6

    View Slide

  113. ΫΠοΫιʔτͷΞϧΰϦζϜ
    1. ϐϘοτΛબͼ

    2. ഑ྻΛϐϘοτҎԼͷ෦෼ͱϐϘοτΑΓେ͖͍෦෼ͱʹ෼͚Δ

    3. ϐϘοτҎԼͷ෦෼ʹ1, 2Λ܁Γฦ͢

    4. ϐϘοτΑΓେ͖͍෦෼ʹ1, 2Λ܁Γฦ͢
    array
    0 1 2 3 4 5 6 7
    2 1 4 3 5 8 7 6
    array
    0 1 2 3
    1 2 4 3 array
    5 6 7
    6 7 8

    View Slide

  114. ΫΠοΫιʔτͷΞϧΰϦζϜ
    1. ϐϘοτΛબͼ

    2. ഑ྻΛϐϘοτҎԼͷ෦෼ͱϐϘοτΑΓେ͖͍෦෼ͱʹ෼͚Δ

    3. ϐϘοτҎԼͷ෦෼ʹ1, 2Λ܁Γฦ͢

    4. ϐϘοτΑΓେ͖͍෦෼ʹ1, 2Λ܁Γฦ͢

    5. Ҏ্Λ࠶ىతʹ܁Γฦ͢
    array
    0 1 2 3 4 5 6 7
    2 1 4 3 5 8 7 6
    array
    0 1 2 3
    1 2 4 3 array
    5 6 7
    6 7 8

    View Slide

  115. ΫΠοΫιʔτΛฒߦԽ͢Δ

    View Slide

  116. ΫΠοΫιʔτΛฒߦԽ͢Δ

    View Slide

  117. ݴ͍׵͑Δͱɺ

    View Slide

  118. ΫΠοΫιʔτͷΞϧΰϦζϜͷத͔Βɺ
    ฒߦԽ͢Δ͜ͱ͕Ͱ͖ΔλεΫΛݟ͚ͭΔ

    View Slide

  119. ฒߦԽ͢Δ͜ͱ͕Ͱ͖ΔλεΫͱ͸

    View Slide

  120. ฒߦԽ͢Δ͜ͱ͕Ͱ͖ΔλεΫͱ͸
    • ޓ͍ʹಠཱͨ͠ॲཧ͸ฒߦԽ͢Δ͜ͱ͕Ͱ͖Δ

    • ಠཱͨ͠ॲཧ͕શͯऴΘͬͨޙɺͦΕͧΕΛ·ͱΊͯҰͭͷ݁ՌΛಘΔ

    View Slide

  121. ฒߦԽ͢Δ͜ͱ͕Ͱ͖ΔλεΫͱ͸
    • ޓ͍ʹಠཱͨ͠ॲཧ͸ฒߦԽ͢Δ͜ͱ͕Ͱ͖Δ

    • ಠཱͨ͠ॲཧ͕શͯऴΘͬͨޙɺͦΕͧΕΛ·ͱΊͯҰͭͷ݁ՌΛಘΔ

    View Slide

  122. ฒߦԽ͢Δ͜ͱ͕Ͱ͖ΔλεΫͱ͸
    • ޓ͍ʹಠཱͨ͠ॲཧ͸ฒߦԽ͢Δ͜ͱ͕Ͱ͖Δ

    • ಠཱͨ͠ॲཧ͕શͯऴΘͬͨޙɺͦΕͧΕΛ·ͱΊͯҰͭͷ݁ՌΛಘΔ
    ΫΠοΫιʔτͷத͔Βಠཱͨ͠
    ॲཧΛݟ͚ͭΑ͏

    View Slide

  123. 59 99
    75 92 15 13 2 31 35
    68 83 67 51 70 77
    a
    0 14
    1 2 3 4 5 6 7 8 9 10 11 12 13
    15 2
    13 31 35 51 59 99 35
    75 83 67 51 70 77
    a
    0 14
    1 2 3 4 5 6 7 8 9 10 11 12 13
    2 15
    13 31 35 51
    a
    0 1 2 3 4 5
    68 75
    67 70 92 83 77 99
    14
    7 8 9 10 11 12 13
    a
    2 13
    a
    0 1
    31 35 51
    3 4 5
    35 51
    4 5
    51
    5
    13
    1
    68
    67 70
    7 8 9
    68 70
    8 9
    70
    9
    83 77 92 99
    14
    11 12 13
    99
    14
    77 83
    11 12
    83
    12

    View Slide

  124. 59 99
    75 92 15 13 2 31 35
    68 83 67 51 70 77
    a
    0 14
    1 2 3 4 5 6 7 8 9 10 11 12 13
    15 2
    13 31 35 51 59 99 35
    75 83 67 51 70 77
    a
    0 14
    1 2 3 4 5 6 7 8 9 10 11 12 13
    2 15
    13 31 35 51
    a
    0 1 2 3 4 5
    68 75
    67 70 92 83 77 99
    14
    7 8 9 10 11 12 13
    a
    2 13
    a
    0 1
    31 35 51
    3 4 5
    35 51
    4 5
    51
    5
    13
    1
    68
    67 70
    7 8 9
    68 70
    8 9
    70
    9
    83 77 92 99
    14
    11 12 13
    99
    14
    77 83
    11 12
    83
    12

    View Slide

  125. 15 2
    13 31 35 51 99 35
    75 83 67 51 70 77
    a
    0 14
    1 2 3 4 5 7 8 9 10 11 12 13
    2 15
    13 31 35 51
    a
    0 1 2 3 4 5
    68 75
    67 70 92 83 77 99
    14
    7 8 9 10 11 12 13
    a
    2 13
    a
    0 1
    31 35 51
    3 4 5
    35 51
    4 5
    51
    5
    13
    1
    68
    67 70
    7 8 9
    68 70
    8 9
    70
    9
    83 77 92 99
    14
    11 12 13
    99
    14
    77 83
    11 12
    83
    12
    2ͭͷಠཱͨ͠ΫΠοΫιʔτ

    View Slide

  126. 2 15
    13 31 35 51
    a
    0 1 2 3 4 5
    68 75
    67 70 92 83 77 99
    14
    7 8 9 10 11 12 13
    a
    2 13
    a
    0 1
    31 35 51
    3 4 5
    35 51
    4 5
    51
    5
    13
    1
    68
    67 70
    7 8 9
    68 70
    8 9
    70
    9
    83 77 92 99
    14
    11 12 13
    99
    14
    77 83
    11 12
    83
    12
    4ͭͷಠཱͨ͠ΫΠοΫιʔτ

    View Slide

  127. ಠཱͨ͠λεΫ͸ฒߦʹॲཧͰ͖Δʂ

    View Slide

  128. SwiftͱGrand Central DispatchͰ
    ࣮૷ͯ͠ΈΔ

    View Slide

  129. ௚ྻॲཧ൛ͷΫΠοΫιʔτ
    ͭ·ΓɺฒߦԽ͢ΔલͷΫΠοΫιʔτ

    View Slide

  130. ௚ྻॲཧ൛ͷΫΠοΫιʔτ

    View Slide

  131. Array͕ࢀর͍ͯ͠Δ
    όοϑΝʔʹ௚઀ΞΫηε
    ௚ྻॲཧ൛ͷΫΠοΫιʔτ

    View Slide

  132. ௚ྻॲཧ൛ͷΫΠοΫιʔτ

    View Slide

  133. ௚ྻॲཧ൛ͷΫΠοΫιʔτ

    View Slide

  134. ௚ྻॲཧ൛ͷΫΠοΫιʔτ

    View Slide

  135. ύʔςΟγϣϯॲཧ
    ௚ྻॲཧ൛ͷΫΠοΫιʔτ

    View Slide

  136. ഑ྻͷϐϘοτҎԼͷ෦෼
    ௚ྻॲཧ൛ͷΫΠοΫιʔτ

    View Slide

  137. ഑ྻͷϐϘοτΑΓେ͖͍෦෼
    ௚ྻॲཧ൛ͷΫΠοΫιʔτ

    View Slide

  138. ௚ྻॲཧ൛ͷΫΠοΫιʔτ

    View Slide

  139. ͜͜ΛฒߦԽ͢Ε͹ྑ͍͸ͣʂ
    ௚ྻॲཧ൛ͷΫΠοΫιʔτ

    View Slide

  140. DispatchQueueΛ࢖ͬͯฒߦԽ

    View Slide

  141. DispatchQueueΛ࢖ͬͯฒߦԽ

    View Slide

  142. DispatchQueueΛ࢖ͬͯฒߦԽ

    View Slide

  143. DispatchQueueΛ࢖ͬͯฒߦԽ

    View Slide

  144. DispatchQueueΛ࢖ͬͯฒߦԽ

    View Slide

  145. DispatchQueueΛ࢖ͬͯฒߦԽ

    View Slide

  146. DispatchQueueΛ࢖ͬͯฒߦԽ
    `async` ͭ·ΓɺඇಉظॲཧͳͷͰɺ
    ιʔτॲཧ͕ऴΘΔલʹؔ਺Λൈ͚ͯ͠·͏ɻ

    View Slide

  147. DispatchQueueΛ࢖ͬͯฒߦԽ

    View Slide

  148. DispatchQueueΛ࢖ͬͯฒߦԽ

    View Slide

  149. DispatchQueueΛ࢖ͬͯฒߦԽ
    ཪͷεϨουͰιʔτ͕ߦΘΕ͍ͯΔ
    ࠷தʹΞΫηε

    View Slide

  150. DispatchQueueΛ࢖ͬͯฒߦԽ

    View Slide

  151. ඇಉظॲཧ͕׬ྃ͢Δ·Ͱ଴ͭඞཁ͕͋Δ

    View Slide

  152. ඇಉظॲཧ͕׬ྃ͢Δ·Ͱ଴ͭඞཁ͕͋Δ
    • DispatchGroup͕࢖͑Δɻ

    • DispatchGroupΛDispatchQueue.async ͷҾ਺ʹ౉͢ͱɺඇಉظॲཧ͕׬ྃ͢
    Δ·ͰεϨουΛϒϩοΫͯ͘͠ΕΔɻ

    View Slide

  153. DispatchGroupͰඇಉظॲཧͷ׬ྃΛ଴ͭ

    View Slide

  154. DispatchGroupͰඇಉظॲཧͷ׬ྃΛ଴ͭ

    View Slide

  155. DispatchGroupͰඇಉظॲཧͷ׬ྃΛ଴ͭ

    View Slide

  156. DispatchGroupͰඇಉظॲཧͷ׬ྃΛ଴ͭ

    View Slide

  157. DispatchGroupͰඇಉظॲཧͷ׬ྃΛ଴ͭ
    શͯͷඇಉظॲཧ͕ऴΘΔ·ͰϒϩοΫ

    View Slide

  158. DispatchGroupͰඇಉظॲཧͷ׬ྃΛ଴ͭ

    View Slide

  159. ϕϯνϚʔΫ
    • 1ԯݸͷϥϯμϜͳ੔਺ͷ഑ྻΛιʔτ

    View Slide

  160. ϕϯνϚʔΫ
    • 1ԯݸͷϥϯμϜͳ੔਺ͷ഑ྻΛιʔτ
    ඪ४ϥΠϒϥϦ

    Array.sort()
    ௚ྻ൛
    ΫΠοΫιʔτ
    ฒߦ൛
    ΫΠοΫιʔτ
    10.3 seconds 9.0 seconds 8.1 seconds
    - 5ճଌఆͨ͠ฏۉ஋Ͱ͢ɻ

    - εϥΠυʹ৐ͤͨίʔυ͸આ໌༻Ͱ͢ɻ࣮ࡍʹଌఆʹར༻ͨ͠ίʔυ͸Githubʹ͋Γ·͢ɻ

    - MacBook Pro 15-inch, 2018, Core i9 2.9 GHz.

    - macOS Catalina 10.15.6, Swift 5.2.4, ࠷దԽ͋Γ ( -O )

    View Slide

  161. ࣌ؒ
    0 sec
    2 sec
    4 sec
    6 sec
    8 sec
    10 sec
    12 sec
    Array.sort() ௚ྻΫΠοΫιʔτ ฒߦΫΠοΫιʔτ

    View Slide

  162. ࣌ؒ
    0 sec
    2 sec
    4 sec
    6 sec
    8 sec
    10 sec
    12 sec
    Array.sort() ௚ྻΫΠοΫιʔτ ฒߦΫΠοΫιʔτ
    ໿10ඵ
    ໿9ඵ
    ໿8ඵ

    View Slide

  163. View Slide

  164. ͋Μ·Γ଎͘ͳ͍ɻ

    View Slide

  165. ͳͥ଎͘ͳ͍ͷ͔

    View Slide

  166. ͳͥ଎͘ͳ͍ͷ͔

    View Slide

  167. ͳͥ଎͘ͳ͍ͷ͔
    ๲େͳ਺ͷΫϩʔδϟΛ
    enqueue ͍ͯ͠Δ

    View Slide

  168. Dispatch
    Queue

    View Slide

  169. Dispatch
    Queue
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }

    View Slide

  170. Dispatch
    Queue
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    CPU
    ίΞ
    CPU
    ίΞ
    CPU
    ίΞ

    View Slide

  171. Dispatch
    Queue
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    CPU
    ίΞ
    CPU
    ίΞ
    CPU
    ίΞ

    View Slide

  172. Dispatch
    Queue
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    CPU
    ίΞ
    CPU
    ίΞ
    CPU
    ίΞ
    ίΞͷୣ͍߹͍

    View Slide

  173. Dispatch
    Queue
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    {
    quickSort()
    quickSort()
    }
    CPU
    ίΞ
    CPU
    ίΞ
    CPU
    ίΞ
    ίΞͷୣ͍߹͍
    Φʔόʔϔου

    View Slide

  174. SemaphoreΛ࢖ͬͯϦιʔεΛ؅ཧ

    View Slide

  175. SemaphoreΛ࢖ͬͯϦιʔεΛ؅ཧ
    • Semaphore͸தʹIntܕͷ਺஋Λ͍࣋ͬͯͯɺϦιʔεͷར༻Մ൱Λ؅ཧ

    • ࠓճ͸CPUͷίΞΛϦιʔεͱߟ͑Δ

    • `signal()` ͰϦιʔε(ίΞ)Λղ์͢Δ

    • `wait()`ͰϦιʔε(ίΞ)Λ࢖༻͢Δ

    View Slide

  176. 8

    View Slide

  177. 8

    View Slide

  178. ࢖༻ՄೳͳϦιʔεͷॳظ஋
    8

    View Slide

  179. Ϧιʔε(ίΞ)͕࢖༻Մೳ͔νΣοΫ
    8

    View Slide

  180. ར༻ՄೳͳΒenqueue
    8

    View Slide

  181. ΫϩʔδϟΛൈ͚Δͱ͖ʹ
    SignalΛૹͬͯར༻׬ྃΛ௨஌
    8

    View Slide

  182. ར༻ෆՄͳΒಉ͡εϨουͰॲཧΛܧଓ
    8

    View Slide

  183. ݁Ռ
    • 1ԯݸͷϥϯμϜͳ੔਺ͷ഑ྻΛιʔτ
    ඪ४ϥΠϒϥϦ

    Array.sort()
    ௚ྻ൛
    ΫΠοΫιʔτ
    ฒߦ൛
    ΫΠοΫιʔτ
    ฒߦ൛
    ΫΠοΫιʔτ

    with Semaphore
    10.3 seconds 9.0 seconds 8.1 seconds 4.5 seconds
    - 5ճଌఆͨ͠ฏۉ஋Ͱ͢ɻ

    - εϥΠυʹ৐ͤͨίʔυ͸આ໌༻Ͱ͢ɻ࣮ࡍʹଌఆʹར༻ͨ͠ίʔυ͸Githubʹ͋Γ·͢ɻ

    - MacBook Pro 15-inch, 2018, Core i9 2.9 GHz.

    - macOS Catalina 10.15.6, Swift 5.2.4, ࠷దԽ͋Γ ( -O )

    View Slide

  184. ࣌ؒ
    0 sec
    2 sec
    4 sec
    6 sec
    8 sec
    10 sec
    12 sec
    Array.sort() ௚ྻΫΠοΫιʔτ ฒߦΫΠοΫιʔτ ฒߦΫΠοΫιʔτվ
    ໿10ඵ
    ໿9ඵ
    ໿8ඵ
    ໿4.5ඵ

    View Slide

  185. 2ഒҎ্ͷߴ଎Խ
    Swiftͷඪ४ϥΠϒϥϦͱൺֱ

    View Slide

  186. 2ഒҎ্ͷߴ଎Խʂ

    View Slide

  187. 2ഒҎ্ͷߴ଎Խʂ
    • SemaphoreͰϦιʔε(ίΞ)ͷར༻Λ੍ޚ͢Δ͜ͱʹΑͬͯΦʔόʔϔουΛ
    ݮΒͨ͠ɻ

    View Slide

  188. 2ഒҎ্ͷߴ଎Խʂ
    • SemaphoreͰϦιʔε(ίΞ)ͷར༻Λ੍ޚ͢Δ͜ͱʹΑͬͯΦʔόʔϔουΛ
    ݮΒͨ͠ɻ

    • Semaphoreͷॳظ஋ -> ར༻Ͱ͖ΔϦιʔεͷ਺

    View Slide

  189. 8

    View Slide

  190. 8
    ηϚϑΥͷॳظ஋: ಉ࣌ʹར༻͞ΕΔίΞͷ਺

    View Slide

  191. • SemaphoreͷΠχγϟϥΠβͷҾ਺͕ɺಉ࣌ʹར༻͞ΕΔίΞͷ਺

    View Slide

  192. • SemaphoreͷΠχγϟϥΠβͷҾ਺͕ɺಉ࣌ʹར༻͞ΕΔίΞͷ਺

    • ಉ࣌ʹར༻͞ΕΔίΞͷ਺Λม͑ͨΒɺॲཧͷ଎͕͞มΘΔ͸ͣ

    View Slide

  193. Semaphoreͷॳظ஋Ͱ଎͞Λൺֱ
    6ίΞ12εϨουͷMacBook ProͰܭଌ

    View Slide

  194. Semaphoreͷॳظ஋Ͱ଎͞Λൺֱ
    6ίΞ12εϨουͷMacBook ProͰܭଌ
    0
    2.5
    5
    7.5
    10
    12.5
    15
    1 2 3 4 5 6 7 8 9 10 11 12 13 14
    - 5ճଌఆͨ͠ฏۉ஋Ͱ͢ɻ

    - 1ԯݸͷϥϯμϜͳ੔਺Λιʔτɻ

    - εϥΠυʹ৐ͤͨίʔυ͸આ໌༻Ͱ͢ɻ࣮ࡍʹଌఆʹར༻ͨ͠ίʔυ͸Githubʹ͋Γ·͢ɻ

    - MacBook Pro 15-inch, 2018, Core i9 2.9 GHz.

    - macOS Catalina 10.15.6, Swift 5.2.4, ࠷దԽ͋Γ ( -O )

    View Slide

  195. Semaphoreͷॳظ஋Ͱ଎͞Λൺֱ
    6ίΞ12εϨουͷMacBook ProͰܭଌ
    0
    2.5
    5
    7.5
    10
    12.5
    15
    1 2 3 4 5 6 7 8 9 10 11 12 13 14
    - 5ճଌఆͨ͠ฏۉ஋Ͱ͢ɻ

    - 1ԯݸͷϥϯμϜͳ੔਺Λιʔτɻ

    - εϥΠυʹ৐ͤͨίʔυ͸આ໌༻Ͱ͢ɻ࣮ࡍʹଌఆʹར༻ͨ͠ίʔυ͸Githubʹ͋Γ·͢ɻ

    - MacBook Pro 15-inch, 2018, Core i9 2.9 GHz.

    - macOS Catalina 10.15.6, Swift 5.2.4, ࠷దԽ͋Γ ( -O )
    ཧ૝

    View Slide

  196. 100%ཧ૝௨Γʹ͸͍͔ͳ͍

    View Slide

  197. 100%ཧ૝௨Γʹ͸͍͔ͳ͍
    • ར༻͢ΔίΞ͕2ഒʹͳΕ͹ɺ଎͞΋2ഒʹͳΔͷ͕100%ͷཧ૝

    • ͦͷͨΊʹ͸ΦʔόʔϔουΛθϩʹ͠ͳ͍ͱ͍͚ͳ͍

    View Slide

  198. 100%ཧ૝௨Γʹ͸͍͔ͳ͍
    • ར༻͢ΔίΞ͕2ഒʹͳΕ͹ɺ଎͞΋2ഒʹͳΔͷ͕100%ͷཧ૝

    • ͦͷͨΊʹ͸ΦʔόʔϔουΛηϩʹ͠ͳ͍ͱ͍͚ͳ͍

    • ΦʔόʔϔουΛ׬શʹθϩʹ͢Δͷ͸ݱ࣮తʹ͸ແཧ

    View Slide

  199. 100%ཧ૝௨Γʹ͸͍͔ͳ͍
    • ར༻͢ΔίΞ͕2ഒʹͳΕ͹ɺ଎͞΋2ഒʹͳΔͷ͕100%ͷཧ૝

    • ͦͷͨΊʹ͸ΦʔόʔϔουΛηϩʹ͠ͳ͍ͱ͍͚ͳ͍

    • ΦʔόʔϔουΛ׬શʹθϩʹ͢Δͷ͸ݱ࣮తʹ͸ແཧ

    • ཧ૝௨Γʹ͸͍͔ͳ͍

    View Slide

  200. ΞδΣϯμ
    • ࠷ۙͷiOSσόΠεͱϚϧνίΞԽʹؔ͢Δ՝୊

    • for loopΛฒߦԽ͢Δ

    • ΫΠοΫιʔτΛฒߦԽ͢Δ

    • ͍Ζ͍ΖͳΦʔόʔϔου

    View Slide

  201. ͦ΋ͦ΋Φʔόʔϔουͱ͸

    View Slide

  202. ͦ΋ͦ΋Φʔόʔϔουͱ͸
    • ΋ͱ΋ͱͷ௚ྻΞϧΰϦζϜʹ͸ͳ͔ͬͨ௥Ճͷॲཧɺ͓ΑͼͦΕʹ͔͔Δ
    ࣌ؒɻ

    View Slide

  203. ͦ΋ͦ΋Φʔόʔϔουͱ͸
    • ΋ͱ΋ͱͷ௚ྻΞϧΰϦζϜʹ͸ͳ͔ͬͨ௥Ճͷॲཧɺ͓ΑͼͦΕʹ͔͔Δ
    ࣌ؒɻ

    • ෳ਺εϨου͔Βͷॻ͖ࠐΈͷอޢɺGCDϝιουͷݺͼग़͠ͳͲɺฒߦԽ
    ͷͨΊʹඞཁͳॲཧʹ͔͔Δ࣌ؒશͯ

    View Slide

  204. ͦ΋ͦ΋Φʔόʔϔουͱ͸
    • ΋ͱ΋ͱͷ௚ྻΞϧΰϦζϜʹ͸ͳ͔ͬͨ௥Ճͷॲཧɺ͓ΑͼͦΕʹ͔͔Δ
    ࣌ؒɻ

    • ෳ਺εϨου͔Βͷॻ͖ࠐΈͷอޢɺGCDϝιουͷݺͼग़͠ͳͲɺฒߦԽ
    ͷͨΊʹඞཁͳॲཧʹ͔͔Δ࣌ؒશͯ

    • ͦͷଞɺؾ෇͖ʹ͍͘΋ͷͱͯ͠False Sharingͱݺ͹ΕΔ΋ͷ΋͋Δ

    View Slide

  205. False Sharing

    View Slide

  206. View Slide

  207. View Slide

  208. View Slide

  209. ผͷεϨουͰ sum() ͱ inc() ΛݺͿ

    View Slide

  210. 0.002 ඵ

    View Slide

  211. 0.002 ඵ

    View Slide

  212. 0.002 ඵ

    View Slide

  213. 0.002 ඵ
    0.2 ඵ

    View Slide

  214. 0.002 ඵ
    0.2 ඵ
    ໿100ഒ

    View Slide

  215. 0.002 ඵ
    0.2 ඵ
    ໿100ഒ
    - 5ճଌఆͨ͠ฏۉ஋Ͱ͢ɻ

    - εϥΠυʹ৐ͤͨίʔυ͸આ໌༻Ͱ͢ɻ࣮ࡍʹଌఆʹར༻
    ͨ͠ίʔυ͸Githubʹ͋Γ·͢ɻ

    - MacBook Pro 15-inch, 2018, Core i9 2.9 GHz.

    - macOS Catalina 10.15.6, Swift 5.2.4, ࠷దԽ͋Γ ( -O )

    View Slide

  216. Core 0 Core 1

    View Slide

  217. Core 0 Core 1
    sum() inc()

    View Slide

  218. x
    y
    ϝΠϯϝϞϦ
    Core 0 Core 1
    sum() inc()

    View Slide

  219. x
    y
    ϝΠϯϝϞϦ
    Core 0 Core 1
    sum() inc()
    Cache Cache
    x y

    View Slide

  220. x
    y
    ϝΠϯϝϞϦ
    Core 0 Core 1
    sum() inc()
    Cache Cache
    x y
    ֤ίΞʹΩϟογϡ͕
    උΘ͍ͬͯΔ

    View Slide

  221. x
    y
    ϝΠϯϝϞϦ
    Core 0 Core 1
    sum() inc()
    Cache Cache
    x y

    View Slide

  222. x
    y
    ϝΠϯϝϞϦ
    Core 0 Core 1
    sum() inc()
    Cache Cache
    x y
    ͦΕͧΕͷίΞͷ
    ΩϟογϡʹΞΫηε

    View Slide

  223. x y
    ϝΠϯϝϞϦ
    Core 0 Core 1
    sum() inc()

    View Slide

  224. x y
    ϝΠϯϝϞϦ
    Core 0 Core 1
    sum() inc()
    ϝϞϦ্ͰྡΓ߹ͬͨ
    Ґஔʹ͋Δ

    View Slide

  225. x y
    ϝΠϯϝϞϦ
    Core 0 Core 1
    sum() inc()
    Cache Cache
    x y x y

    View Slide

  226. x y
    ϝΠϯϝϞϦ
    Core 0 Core 1
    sum() inc()
    Cache Cache
    x y x y

    View Slide

  227. x y
    ϝΠϯϝϞϦ
    Core 0 Core 1
    sum() inc()
    Cache Cache
    x y x y
    Yʹରͯ͠ॻ͖ࠐΈ

    View Slide

  228. x y
    ϝΠϯϝϞϦ
    Core 0 Core 1
    sum() inc()
    Cache Cache
    x y x y'

    View Slide

  229. x y'
    ϝΠϯϝϞϦ
    Core 0 Core 1
    sum() inc()
    Cache Cache
    x y' x y'
    ͪ͜ΒͷΩϟογϡ΋
    ߋ৽ͯ͠͠·͏

    View Slide

  230. x y
    ϝΠϯϝϞϦ
    Core 0 Core 1
    sum() inc()
    Cache Cache
    x y' x y'
    Φʔόʔϔου
    ͪ͜ΒͷΩϟογϡ΋
    ߋ৽ͯ͠͠·͏

    View Slide

  231. False Sharing
    ೔ຊޠͰ͸ِڞ༗(͖͗ΐ͏Ώ͏)͋Δ͍͸ෆਖ਼ڞ༗

    View Slide

  232. False Sharing
    ೔ຊޠͰ͸ِڞ༗(͖͗ΐ͏Ώ͏)͋Δ͍͸ෆਖ਼ڞ༗
    • xͱy͸ϓϩάϥϜͷҙຯ্͸ແؔ܎ͷ͸ͣ

    • ͔͠͠ɺxͱy͸ϋʔυ΢ΣΞతʹ͸ಉ͡ΩϟογϡϥΠϯ্ʹଘࡏ͢Δ

    • ϋʔυ΢ΣΞ͸ΩϟογϡϥΠϯΛ୯ҐʹΩϟογϡͷߋ৽Λߦ͏ͨΊɺ

    yͷߋ৽͝ͱʹଞͷίΞͷΩϟογϡ΋ߋ৽͠ͳ͚Ε͹ͳΒͳ͍

    View Slide

  233. False Sharing
    ೔ຊޠͰ͸ِڞ༗(͖͗ΐ͏Ώ͏)͋Δ͍͸ෆਖ਼ڞ༗
    • xͱy͸ϓϩάϥϜͷҙຯ্͸ແؔ܎ͷ͸ͣ

    • ͔͠͠ɺxͱy͸ϋʔυ΢ΣΞతʹ͸ಉ͡ΩϟογϡϥΠϯ্ʹଘࡏ͢Δ

    • ϋʔυ΢ΣΞ͸ΩϟογϡϥΠϯΛ୯ҐʹΩϟογϡͷߋ৽Λߦ͏ͨΊɺ

    yͷߋ৽͝ͱʹଞͷίΞͷΩϟογϡ΋ߋ৽͠ͳ͚Ε͹ͳΒͳ͍
    Φʔόʔϔου

    View Slide

  234. ࠷ޙʹ

    View Slide

  235. ฒߦΞϧΰϦζϜͱͷ෇͖߹͍ํ
    • ͍͖ͳΓฒߦΞϧΰϦζϜ͔Β࢝ΊΔͷ͸͓͢͢ΊͰ͖ͳ͍ɻ

    • ·ͣ͸௚ྻͷΞϧΰϦζϜ͔ΒॳΊͯɺύϑΥʔϚϯεʹ໰୊͕͋Ε͹ฒߦΞ
    ϧΰϦζϜΛݕ౼͢Δͷ͕ྑ͍ɻ

    • ฒߦΞϧΰϦζϜ͸ɺਖ਼௚ʹݴͬͯ؆୯Ͱ͸ͳ͍ͷͰɺ͍͖ͳΓ࣮૷Λ࢝ΊΔ
    લʹઐ໳ͷॻ੶ΛಡΜͰΈΔͷ͕͓͢͢ΊͰ͢ɻ

    View Slide

  236. Acknowledgements
    ࢀߟࢿྉ

    View Slide

  237. Acknowledgements
    ฒߦΞϧΰϦζϜʹ͍ͭͯͷࢀߟॻ੶
    • The Art of Concurrency

    • ࿨༁: ฒߦίϯϐϡʔςΟϯάٕ๏

    View Slide

  238. Acknowledgements
    Concurrent Mapʹ͍ͭͯ
    • objc.io, Concurrent Map

    • https://talk.objc.io/episodes/S01E90-concurrent-map

    View Slide

  239. Acknowledgements
    False Sharingʹ͍ͭͯ
    • https://www.isus.jp/products/vtune/pu38-02-detecting-and-mitigating-false-
    sharing/

    View Slide

  240. ·ͱΊ
    • ΞϧΰϦζϜͷத͔ΒฒߦͰॲཧ͢Δ͜ͱ͕Ͱ͖ΔλεΫΛݟ͚ͭΔ

    • ฒߦԽʹͱ΋ͳ͏ΦʔόʔϔουΛθϩʹ͢Δͷ͸ݱ࣮తʹ͸೉͍͠

    • ฒߦԽͷԸܙ͕ΦʔόʔϔουʹΑΔϖφϧςΟΛ্ճΕ͹ྑ͍

    View Slide