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
デザインシステムが必須の時代に
yosuke_furukawa
PRO
2
230
Node.js, Deno, Bun 最新動向とその所感について
yosuke_furukawa
PRO
10
5.2k
Welcome JSConf.jp 2024
yosuke_furukawa
PRO
1
4.7k
tc39 x jsconf.jp Panel Discussion 2024
yosuke_furukawa
PRO
0
340
Removing Corepack
yosuke_furukawa
PRO
9
1.9k
JavaScript Runtime とはなにか
yosuke_furukawa
PRO
15
3.1k
Strip Types と Storage
yosuke_furukawa
PRO
4
510
Module Harmony について
yosuke_furukawa
PRO
4
1.9k
LTのやり方
yosuke_furukawa
PRO
16
3k
Other Decks in Programming
See All in Programming
LLM Plugin for Node-REDの利用方法と開発について
404background
0
170
Claspは野良GASの夢をみるか
takter00
0
190
エージェンティックRAGにAWSで入門しよう!
har1101
8
1.5k
Inside Stream API
skrb
1
700
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
120
「エンジニアインターン、どうやって取った?」準備のリアルを語るLT会 Progate BAR
akiomatic
0
130
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
230
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
330
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
120
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
780
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
180
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
220
Featured
See All Featured
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
590
Crafting Experiences
bethany
1
180
Measuring & Analyzing Core Web Vitals
bluesmoon
9
860
YesSQL, Process and Tooling at Scale
rocio
174
15k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
ラッコキーワード サービス紹介資料
rakko
1
3.6M
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
200
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
Test your architecture with Archunit
thirion
1
2.3k
The agentic SEO stack - context over prompts
schlessera
0
820
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Being A Developer After 40
akosma
91
590k
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