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
XHTMLが残したもの
yosuke_furukawa
PRO
1
410
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
390
デザインシステムが必須の時代に
yosuke_furukawa
PRO
2
270
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
Other Decks in Programming
See All in Programming
Pythonの実行はどこまで賢くなったのか? CPythonとPyPyから見る最適化のしくみ
curekoshimizu
4
2.8k
{ Android | Kotlin } Gradle Plugin in 2026
ryunen344
1
290
週末にAI-DLCを本気で回したら$1,600溶けた
hbashimizu
0
130
[DroidKaigi 2026] Bring your own phones to Gradle Managed Devices
f2lk
0
110
Discordを用いたラボオートメーション関連情報収集の自動化
noguhiro2002
0
500
Go 1.27からのGODEBUG / Go 1.27 リリースパーティ #go127party
mazrean
0
320
デプロイ直後のレイテンシスパイクを調べたら、 Railsの仕様にたどり着いた
nhsykym
0
110
30年振りにコンパイラの定数整数除算を改善した
herumi
9
4.4k
PHPプロジェクトの結合バランスを可視化する #php_night
kajitack
0
220
業務時間外もAIに働いてもらう話
colorful12
3
10k
【DroidKaigi 2026】「アクセシビリティを利用するとき、 アクセシビリティもまたこちらを利用している」 〜マルウェアによる攻撃と防衛について〜
halunoyo
0
400
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
0
140
Featured
See All Featured
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.5k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Color Theory Basics | Prateek | Gurzu
gurzu
0
460
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
440
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
ラッコキーワード サービス紹介資料
rakko
1
4.8M
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
310
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
250
The browser strikes back
jonoalderson
0
1.6k
We Have a Design System, Now What?
morganepeng
55
8.3k
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