Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
どの非同期処理が良いのか勝負
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
Webの地図
yosuke_furukawa
PRO
6
5.1k
XHTMLが残したもの
yosuke_furukawa
PRO
2
930
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
440
デザインシステムが必須の時代に
yosuke_furukawa
PRO
2
320
Node.js, Deno, Bun 最新動向とその所感について
yosuke_furukawa
PRO
10
5.4k
Welcome JSConf.jp 2024
yosuke_furukawa
PRO
1
4.9k
tc39 x jsconf.jp Panel Discussion 2024
yosuke_furukawa
PRO
0
380
Removing Corepack
yosuke_furukawa
PRO
9
2k
JavaScript Runtime とはなにか
yosuke_furukawa
PRO
15
3.2k
Other Decks in Programming
See All in Programming
全ての永続トークンを、生まれる前に消し去りたい!
sylph01
1
300
Vue Fes Japan の “作る側”に関わってみて
naokihaba
0
150
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
210
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
970
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
780
最近”作らせてる” ローカルAIアプリの話
akit37
0
450
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
8
5.7k
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
240
ActionController meets Protocol Buffers
sorah
0
190
コードで差別化できない時代の ソフトウェアエンジニアリング / Software Engineering in an Era Where Code Doesn’t Differentiate
kishida
2
160
ジョジョの世界をXRで再現する
mofurune
0
150
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
4
4.7k
Featured
See All Featured
Raft: Consensus for Rubyists
vanstee
142
7.8k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
360
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
300
Unsuck your backbone
ammeep
672
58k
Optimising Largest Contentful Paint
csswizardry
37
4k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
350
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
Prompt Engineering for Job Search
mfonobong
0
500
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
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