$30 off During Our Annual Pro Sale. View Details »

どの非同期処理が良いのか勝負

 どの非同期処理が良いのか勝負

JSオジサンで発表した資料です。

Yosuke Furukawa
PRO

December 17, 2015
Tweet

More Decks by Yosuke Furukawa

Other Decks in Programming

Transcript

  1. Ͳͷඇಉظॲཧ͕ྑ͍
    ͷ͔উෛ
    @yosuke_furukawa

    View Slide

  2. Twitter: @yosuke_furukawa
    Github: yosuke-furukawa

    View Slide

  3. Node.js೔ຊϢʔβʔάϧʔϓ୅ද
    Node.js Evangelist / Node.js Collaborator

    View Slide

  4. ҰԠઆ໌
    • Node.js ʹ͸ͨ͘͞Μͷඇಉظॲཧ͕͋Δ
    • callback
    • Promise
    • Stream
    • generator / yield
    • (Ͱ͖ͨΒ) async await

    View Slide

  5. ͲΕ͕Ұ൪͍͍ͷΑʁ
    • έʔεόΠέʔε

    View Slide

  6. ͲΕ͕Ұ൪͍͍ͷΑʁ
    • έʔεόΠέʔε
    ΄Μͱʁʁʁ

    View Slide

  7. Callbackࢯ
    // Ұ൪୯७ɺ஍ࠈΛݟΔ͜ͱ΋͋Δɻ
    'use strict';
    const fs = require('fs');
    fs.readFile('/path/to/foo.txt', (err, foo) => {
    if (err) {
    console.error(err);
    return;
    }
    fs.readFile('/path/to/bar.txt', (err, bar) => {
    if (err) {
    console.error(err);
    return;
    }
    console.log(`${foo}${bar}`);
    });
    });
    Ұ൪୯७͚ͩͲɺ஍ࠈΛݟΔ͜ͱ΋͋Δɻ

    View Slide

  8. Promise ࢯ
    'use strict';
    const fs = require('fs');
    const promisify = require('./promisify');
    const readFile = promisify(fs.readFile);
    Promise.all([
    readFile('/path/to/foo.txt'),
    readFile('/path/to/bar.txt'),
    ]).then((results) => {
    console.log(results.join(''));
    }).catch((err) => {
    console.error(err);
    });
    &4Ͱೖͬͨඪ४ඇಉظॲཧɺਓؾ͋Δ͚Ͳɺ
    DBODFM͕ͳ͔ͬͨΓͱएׯยखམͪײ͕͋Δɻ

    View Slide

  9. Stream ࢯ
    'use strict';
    const fs = require('fs');
    const fooStream = fs.createReadStream('/path/to/foo.txt');
    const barStream = fs.createReadStream('/path/to/bar.txt');
    fooStream.pipe(process.stdout);
    barStream.pipe(process.stdout);
    Node.js ͷதͰ෯Λར͔͍ͤͯΔ࿈ଓͨ͠
    σʔλΛѻ͏ͨΊॲཧɺStreamΛ੍͢Δ΋
    ͷ͸NodeΛ੍͢Δ

    View Slide

  10. generator/yield ࢯ
    'use strict';
    const co = require('co');
    const fs = require('mz/fs');
    co(function* (){
    const foo = yield fs.readFile('/path/to/foo.txt');
    const bar = yield fs.readFile('/path/to/bar.txt');
    return foo + bar;
    }).then((data) => {
    console.log(data);
    });
    ؔ਺ͷ్தͰࢭΊΔͱ͍͏generatorؔ਺ͷಛੑΛར༻ͨ͠
    ॲཧɺ ES2015Ͱ༗ޮʹɻ஗͍ͱ͍͏ᷚ΋͋Δ͕ɺɺɺ

    View Slide

  11. async/await ࢯ
    'use strict';
    const fs = require('mz/fs');
    const concat = async function() {
    const foo = await fs.readFile('/path/to/foo.txt');
    const bar = await fs.readFile('/path/to/bar.txt');
    return foo + bar;
    };
    console.log(concat());
    ESnextͰఏҊதͷ௒৽੕ɻ࢓༷ʹೖΔͷ͸࠶དྷ೥Ҏ͔߱ʁ

    View Slide

  12. ͲΕ͕Ұ൪͍͍ͷΑʁ
    • έʔεόΠέʔε
    • callback => ୯७ɻͨͩ͠஍ࠈΛݟΔ͕࣌͋Δɻ
    • Promise => ES2015 Ͱೖͬͨඪ४ඇಉظॲཧɺͳΜͱͳ͘cancel͕ͳ͍ͱ͔ยखམ
    ͪײ͋Δɻ
    • Stream => Node.js ͷதͰ෯Λར͔͍ͤͯΔ࿈ଓͨ͠σʔλΛѻ͏ͨΊॲཧɺ
    StreamΛ੍͢Δ΋ͷ͸NodeΛ੍͢Δ
    • generator / yield => ؔ਺ͷ్தͰࢭΊΔͱ͍͏generatorؔ਺ͷಛੑΛར༻ͨ͠ॲ
    ཧɺ ES2015Ͱ༗ޮʹɻco΍koaͱ͔͕࠾༻ͯ͠Δɻ
    • async await => ௒৽੕ɺ ESnext ͰఏҊத

    View Slide

  13. ͲΕ͕Ұ൪͍͍ͷΑʁ
    • έʔεόΠέʔε
    • callback => ୯७ɻͨͩ͠஍ࠈΛݟΔ͕࣌͋Δɻ
    • Promise => ES2015 Ͱೖͬͨඪ४ඇಉظॲཧ
    • Stream => Node.js ͷதͰ෯Λར͔͍ͤͯΔ࿈ଓͨ͠σʔλΛѻ͏ͨ
    ΊͷIOʹಛԽͨ͠ॲཧ
    • generator / yield => ES2015ͰೖͬͨएׯHackyͳॲཧ
    • async await => ಥ೗ݱΕͨ௒৽੕ɺ ESnext ͰఏҊத
    ͪΐ·Ͳ͞ΜٖਓԽ͓ئ͍க͠·͢ʂʂʂʂ

    View Slide

  14. ͱΓ͋͑ͣɺଌͬͯΈΑ͏
    • file copy ॲཧ (খ͍͞ϑΝΠϧίϐʔ 1KB x 1000)
    • callback => 0.10sec
    • Promise => 0.10sec
    • Stream => 0.09sec
    • generator/yield => 0.11sec

    View Slide

  15. ͱΓ͋͑ͣɺଌͬͯΈΑ͏
    • file copy ॲཧ (খ͍͞ϑΝΠϧίϐʔ 1KB x 1000)
    • callback => 0.10sec
    • Promise => 0.10sec
    • Stream => 0.09sec
    • generator/yield => 0.11sec
    มΘΒͳ͍ʜ

    View Slide

  16. ͱΓ͋͑ͣɺଌͬͯΈΑ͏
    • file copy ॲཧ (ൺֱతେ͖͍ϑΝΠϧίϐʔ 15MB)
    • callback => 1.51sec
    • Promise => 1.54sec
    • Stream => 1.05sec
    • generator/yield => 1.59sec

    View Slide

  17. ͱΓ͋͑ͣɺଌͬͯΈΑ͏
    • file copy ॲཧ (ൺֱతେ͖͍ϑΝΠϧίϐʔ 15MB)
    • callback => 1.51sec
    • Promise => 1.54sec
    • Stream => 1.05sec
    • generator/yield => 1.59sec
    4USFBN଎͍

    View Slide

  18. ͱΓ͋͑ͣɺଌͬͯΈΑ͏
    • ੑೳଌఆ݁Ռ
    • Stream > callback ≒ Promise ≒ generator
    • େ͖͍ϑΝΠϧʹͳΔ΄ͲϑΝΠϧॻ͖ग़͠
    Λஞ࣍తʹॲཧͰ͖ΔͷͰStream଎͍ɻ

    View Slide

  19. Stream࠷ߴʢʁʣ
    • ׳Εͯͳ͍ਓଟ͍
    • ͋ͱϒϥ΢βͰ࢖͑ͳ͍ɻɻɻ

    View Slide

  20. ׳Εͯͳ͍ਓଟ͍
    • Node.js Ͱ͸͜͏͍͏֨ݴ͕͋Δ
    • ʰStreamΛ੍͢Δ΋ͷ͸NodeΛ੍͢Δʱ
    • ͔ͳΓύϑΥʔϚϯεʹؾΛ࢖ͬͯΔ͔Βੵ
    ۃతʹ࢖͍ͬͯ͘΂͖ (in Node)

    View Slide

  21. ϒϥ΢βͰ࢖͑ͳ͍ɻɻɻ
    • ͦΕͳʁ
    • ఏҊ͞Ε͍ͯΔ͔Βʂʂʂ

    View Slide

  22. ๻ͷߟ͑ํ
    /PEFKT
    σʔλۦಈ͔Ͳ͏͔
    Y
    4USFBN
    N
    ੑೳؾʹͳΔ
    Y
    1SPNJTF
    Y
    HFOFSBUPS
    N
    1SPNJTJGZ
    ͍ͨ͠
    Y DBMMCBDL
    N
    N

    View Slide