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
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
4.7k
XHTMLが残したもの
yosuke_furukawa
PRO
2
830
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
410
デザインシステムが必須の時代に
yosuke_furukawa
PRO
2
310
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
370
Removing Corepack
yosuke_furukawa
PRO
9
2k
JavaScript Runtime とはなにか
yosuke_furukawa
PRO
15
3.2k
Other Decks in Programming
See All in Programming
XP祭りでしか伝わらないフリップネタ #xpjug
murabayashi
0
150
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
1
500
thread_parallel_with_free-threaded_Python_and_NumPy.pdf
riku_sakamoto
0
350
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
220
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
310
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
200
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
2.9k
スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜
atsuki_seo
0
160
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
470
App Intentsのビルドプロセスを支える技術
kntkymt
0
410
AI に Inclusive UI を書かせよう — Design Rules Skill で Compose UI を作り直す
theoriatec2024
1
510
20260914 AIエージェント時代のPlatform Engineering LLM基盤とプロダクトの責務境界線
kanfab1
7
2.1k
Featured
See All Featured
Navigating Team Friction
lara
192
16k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
250
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
240
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.1k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
400
Designing Powerful Visuals for Engaging Learning
tmiket
1
570
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Claude Code のすすめ
schroneko
67
230k
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