Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
どの非同期処理が良いのか勝負
Search
Yosuke Furukawa
PRO
December 17, 2015
Programming
9.4k
14
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
どの非同期処理が良いのか勝負
JSオジサンで発表した資料です。
Yosuke Furukawa
PRO
December 17, 2015
More Decks by Yosuke Furukawa
See All by Yosuke Furukawa
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
340
デザインシステムが必須の時代に
yosuke_furukawa
PRO
2
250
Node.js, Deno, Bun 最新動向とその所感について
yosuke_furukawa
PRO
10
5.3k
Welcome JSConf.jp 2024
yosuke_furukawa
PRO
1
4.8k
tc39 x jsconf.jp Panel Discussion 2024
yosuke_furukawa
PRO
0
360
Removing Corepack
yosuke_furukawa
PRO
9
2k
JavaScript Runtime とはなにか
yosuke_furukawa
PRO
15
3.2k
Strip Types と Storage
yosuke_furukawa
PRO
4
530
Module Harmony について
yosuke_furukawa
PRO
4
1.9k
Other Decks in Programming
See All in Programming
いまどきの Codex で開発する visionOS アプリの開発スタイルについて
karad
0
150
5分で問診!Composer セキュリティ健康診断
codmoninc
0
1.1k
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
210
まずはプロンプトガイドを読もう、話はそれからだ
kiakiraki
1
150
torikago - Ruby::Boxで照らすモジュラモノリスの実行境界
se4weed
1
400
運用ダッシュボードの設計を誰も教えてくれないのだけどみなさんどうしてるんですか? - チームに監視するという文化を根付かせるための第一歩を踏みたい -
satoshi256kbyte
1
130
楽しそうなつよつよエンジニアと目が死んでる僕/A brilliant engineer having a blast, and dead-eyed me.
3l4l5
2
200
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
490
How I Won Prize Money at a Hackathon Using Codex and Symphony Alpha
yasei_no_otoko
0
110
React本体のコードリーディング
high_g_engineer
1
150
テーブルをDELETEした
yuzneri
0
150
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
730
Featured
See All Featured
A better future with KSS
kneath
240
18k
A Soul's Torment
seathinner
6
3.5k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
250
How to make the Groovebox
asonas
2
2.3k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
sira's awesome portfolio website redesign presentation
elsirapls
0
330
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
170
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
990
BBQ
matthewcrist
89
10k
The Spectacular Lies of Maps
axbom
PRO
1
930
The Cult of Friendly URLs
andyhume
79
7k
Transcript
Ͳͷඇಉظॲཧ͕ྑ͍ ͷ͔উෛ @yosuke_furukawa
Twitter: @yosuke_furukawa Github: yosuke-furukawa
Node.jsຊϢʔβʔάϧʔϓද Node.js Evangelist / Node.js Collaborator
ҰԠઆ໌ • Node.js ʹͨ͘͞Μͷඇಉظॲཧ͕͋Δ • callback • Promise • Stream
• generator / yield • (Ͱ͖ͨΒ) async await
ͲΕ͕Ұ൪͍͍ͷΑʁ • έʔεόΠέʔε
ͲΕ͕Ұ൪͍͍ͷΑʁ • έʔεόΠέʔε ΄Μͱʁʁʁ
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}`); }); }); Ұ൪୯७͚ͩͲɺࠈΛݟΔ͜ͱ͋Δɻ
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͕ͳ͔ͬͨΓͱएׯยखམͪײ͕͋Δɻ
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Λ੍͢Δ
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Ͱ༗ޮʹɻ͍ͱ͍͏ᷚ͋Δ͕ɺɺɺ
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ͰఏҊதͷ৽ɻ༷ʹೖΔͷ࠶དྷҎ͔߱ʁ
ͲΕ͕Ұ൪͍͍ͷΑʁ • έʔεόΠέʔε • callback => ୯७ɻͨͩ͠ࠈΛݟΔ͕࣌͋Δɻ • Promise =>
ES2015 Ͱೖͬͨඪ४ඇಉظॲཧɺͳΜͱͳ͘cancel͕ͳ͍ͱ͔ยखམ ͪײ͋Δɻ • Stream => Node.js ͷதͰ෯Λར͔͍ͤͯΔ࿈ଓͨ͠σʔλΛѻ͏ͨΊॲཧɺ StreamΛ੍͢ΔͷNodeΛ੍͢Δ • generator / yield => ؔͷ్தͰࢭΊΔͱ͍͏generatorؔͷಛੑΛར༻ͨ͠ॲ ཧɺ ES2015Ͱ༗ޮʹɻcokoaͱ͔͕࠾༻ͯ͠Δɻ • async await => ৽ɺ ESnext ͰఏҊத
ͲΕ͕Ұ൪͍͍ͷΑʁ • έʔεόΠέʔε • callback => ୯७ɻͨͩ͠ࠈΛݟΔ͕࣌͋Δɻ • Promise =>
ES2015 Ͱೖͬͨඪ४ඇಉظॲཧ • Stream => Node.js ͷதͰ෯Λར͔͍ͤͯΔ࿈ଓͨ͠σʔλΛѻ͏ͨ ΊͷIOʹಛԽͨ͠ॲཧ • generator / yield => ES2015ͰೖͬͨएׯHackyͳॲཧ • async await => ಥݱΕͨ৽ɺ ESnext ͰఏҊத ͪΐ·Ͳ͞ΜٖਓԽ͓ئ͍க͠·͢ʂʂʂʂ
ͱΓ͋͑ͣɺଌͬͯΈΑ͏ • file copy ॲཧ (খ͍͞ϑΝΠϧίϐʔ 1KB x 1000) •
callback => 0.10sec • Promise => 0.10sec • Stream => 0.09sec • generator/yield => 0.11sec
ͱΓ͋͑ͣɺଌͬͯΈΑ͏ • file copy ॲཧ (খ͍͞ϑΝΠϧίϐʔ 1KB x 1000) •
callback => 0.10sec • Promise => 0.10sec • Stream => 0.09sec • generator/yield => 0.11sec มΘΒͳ͍ʜ
ͱΓ͋͑ͣɺଌͬͯΈΑ͏ • file copy ॲཧ (ൺֱతେ͖͍ϑΝΠϧίϐʔ 15MB) • callback =>
1.51sec • Promise => 1.54sec • Stream => 1.05sec • generator/yield => 1.59sec
ͱΓ͋͑ͣɺଌͬͯΈΑ͏ • file copy ॲཧ (ൺֱతେ͖͍ϑΝΠϧίϐʔ 15MB) • callback =>
1.51sec • Promise => 1.54sec • Stream => 1.05sec • generator/yield => 1.59sec 4USFBN͍
ͱΓ͋͑ͣɺଌͬͯΈΑ͏ • ੑೳଌఆ݁Ռ • Stream > callback ≒ Promise ≒
generator • େ͖͍ϑΝΠϧʹͳΔ΄ͲϑΝΠϧॻ͖ग़͠ Λஞ࣍తʹॲཧͰ͖ΔͷͰStream͍ɻ
Stream࠷ߴʢʁʣ • ׳Εͯͳ͍ਓଟ͍ • ͋ͱϒϥβͰ͑ͳ͍ɻɻɻ
׳Εͯͳ͍ਓଟ͍ • Node.js Ͱ͜͏͍͏֨ݴ͕͋Δ • ʰStreamΛ੍͢ΔͷNodeΛ੍͢Δʱ • ͔ͳΓύϑΥʔϚϯεʹؾΛͬͯΔ͔Βੵ ۃతʹ͍͖ͬͯ͘ (in
Node)
ϒϥβͰ͑ͳ͍ɻɻɻ • ͦΕͳʁ • ఏҊ͞Ε͍ͯΔ͔Βʂʂʂ
ͷߟ͑ํ /PEFKT σʔλۦಈ͔Ͳ͏͔ Y 4USFBN N ੑೳؾʹͳΔ Y 1SPNJTF Y
HFOFSBUPS N 1SPNJTJGZ ͍ͨ͠ Y DBMMCBDL N N