Slide 1

Slide 1 text

Introduction to Rust Akito Ito (@Akito0107) NodeֶԂ25࣌ݶ໨

Slide 2

Slide 2 text

ࣗݾ঺հ • ҏ౻ ӯ (@Akito0107) • Twitter / mstdn / Githubେମ͜ΕͰ͢ • ϦΫϧʔτςΫϊϩδʔζͱ͍͏ձࣾͰ
 ιϑτ΢ΣΞΤϯδχΞΛ΍͍ͬͯ·͢ɻ • ීஈ͸js(΋)ॻ͍ͯ·͢

Slide 3

Slide 3 text

ͪΐͬͱ঺հ ઌिWʹͳΓ·ͨ͠ʂ

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

Agenda • Rustͱ͸ • RustͷԿ͕৽͍͠ͷ͔ • Rustͷ׆༻Λߟ͑Δ

Slide 6

Slide 6 text

Rustͱ͸ • ొ৔࣌ظ͸2010೥͝Ζɻ2015೥10݄ʹ1.0ͷ ϦϦʔε • ओ೚։ൃऀ: Graydon Hoare • ϚϧνύϥμΠϜݴޠ • ҆શੑɺฒྻੑΛओ؟

Slide 7

Slide 7 text

Rustͷ༻్ • System Programming • Network Programming • Kernel (OS / Device Driver / rust.koͰggr ) • Web Assembly (LLVMͷԸܙ) • etc…

Slide 8

Slide 8 text

Rust࠾༻اۀ • Mozilla • Dwango • ෼ࢄfs • Dropbox • lossless compression

Slide 9

Slide 9 text

RustͷԿ͕৽͍͠ͷ͔ • ϝϞϦ؅ཧ • खಈ / Smart Ptr / GCͳͲͷطଘͷ࢓૊Έͱ͸
 ҰઢΛը͢Δ • ҆શʹϝϞϦͷ؅ཧΛߦ͏
 => ॴ༗ݖͱ͍͏֓೦

Slide 10

Slide 10 text

ϝϞϦྖҬͷछྨ • ΦϒδΣΫτΛಈతʹ֬อ͢ΔͨΊʹ༻͍Δ
 ϝϞϦྖҬʹ͸StackͱHeapͷ2छྨ͋Δ

Slide 11

Slide 11 text

Stack • ̍ͭͷؔ਺΍αϒϧʔνϯ಺ͰͷΈ࢖༻͞Ε ΔΦϒδΣΫτͷ֬อʹ༻͍ΒΕΔ • είʔϓ͔Βൈ͚Δͱ։์͞ΕΔ • ߴ଎ʹ࣮ߦ͞ΕΔ

Slide 12

Slide 12 text

Heap • ෳ਺ͷαϒϧʔνϯɺؔ਺Ͱ࢖͍·Θ͞ΕΔΦϒδΣ Ϋτͷ֬อʹ༻͍ΒΕΔ • ໌ࣔతʹ։์͕ඞཁ
 (ण໋ͷ؅ཧ) • (Stackʹൺ΂)
 Ұൠతʹ௿଎ • σʔλߏ଄ͷheapͱ͸ؔ܎͕ͳ͍

Slide 13

Slide 13 text

StackͱHeap (Cͷྫ) 1 int foo() { 2 int len = 100; 3 int* head = (int*) malloc(sizeof(int) * len); 4 /* do some work.... */ 5 free(head); 6 return 0; 7 }

Slide 14

Slide 14 text

StackͱHeap (Cͷྫ) 1 int foo() { 2 int len = 100; 3 int* head = (int*) malloc(sizeof(int) * len); 4 /* do some work.... */ 5 free(head); 6 return 0; 7 } <= StackʹlenΛpush

Slide 15

Slide 15 text

StackͱHeap (Cͷྫ) 1 int foo() { 2 int len = 100; 3 int* head = (int*) malloc(sizeof(int) * len); 4 /* do some work.... */ 5 free(head); 6 return 0; 7 } ⊖ HeapʹྖҬΛ֬อ

Slide 16

Slide 16 text

StackͱHeap (Cͷྫ) 1 int foo() { 2 int len = 100; 3 int* head = (int*) malloc(sizeof(int) * len); 4 /* do some work.... */ 5 free(head); 6 return 0; 7 } <= Heap͔Β໌ࣔతʹ։์

Slide 17

Slide 17 text

StackͱHeap (Cͷྫ) 1 int foo() { 2 int len = 100; 3 int* head = (int*) malloc(sizeof(int) * len); 4 /* do some work.... */ 5 free(head); 6 return 0; 7 } <= Block͕ऴྃɺlen͕stack͔Βpop͞ΕΔ

Slide 18

Slide 18 text

ϝϞϦ؅ཧখൌ (1) • Cݴޠ͸Heapͷ؅ཧΛखಈͰ͍ͯͨ͠ɻ • malloc() / free() • ਓྨʹ͸·ͩૣ͔ͬͨ

Slide 19

Slide 19 text

खಈͰͷϝϞϦ؅ཧ 1 int foo() { 2 int len = 100; 3 int* head = (int*) malloc(sizeof(int) * len); 4 /* do some work.... */ 5 free(head); 6 return 0; 7 } ͜͜Ͱ֬อ

Slide 20

Slide 20 text

खಈͰͷϝϞϦ؅ཧ 1 int foo() { 2 int len = 100; 3 int* head = (int*) malloc(sizeof(int) * len); 4 /* do some work.... */ 5 free(head); 6 return 0; 7 } ͜͜Ͱ։์

Slide 21

Slide 21 text

CݴޠͰͷϝϞϦ؅ཧ • ಈతʹϝϞϦΛ֬อͨ͠Βɺඞͣࣗ෼Ͱղ์͠ͳ ͚Ε͹ͳΒͳ͍ • ม਺ͷण໋ΛखಈͰ؅ཧ͢Δͷ͸ਓྨʹ͸೉͍͠ • free()Λॻ͖๨ΕΔ <= memory leak • free()ͨ͠ϙΠϯλΛࢀর <= Seg fault

Slide 22

Slide 22 text

ϝϞϦ؅ཧখൌ(2) • Garbage Collector (GC) ͷొ৔ • ͍Βͳ͘ͳͬͨHeapྖҬͷΦϒδΣΫτΛॲཧܥ͕ऩ ू͠ɺࣗಈͰ։์ͯ͘͠ΕΔ(ण໋؅ཧͷࣗಈԽ) • Java / Ruby / Python / Go…
 ࠓ೔஌ΒΕ͍ͯΔଟ͘ͷॲཧܥ͸GCΛ࣮૷ • ΋ͪΖΜJavascript΋͜Ε

Slide 23

Slide 23 text

GCݴޠʹ͓͚ΔϝϞϦ؅ཧͷ
 ࢓૊Έ • ੜ͖ͯΔΦϒδΣΫτͱࢮΜͰΔΦϒδΣΫ τΛ൑ผ͠ɺࢮΜͰΔΦϒδΣΫτΛ։์ 7.)FBQ 3PPU
 0CK " # $ %

Slide 24

Slide 24 text

GCͷ໰୊఺ • ॏ͍ • GC͕૸͍ͬͯΔؒ͸ॲཧ͕ࢭ·Δ
 (Stop The world) • ॲཧܥ͕ෳࡶʹͳΔ • ਓྨ͸ద߹Ͱ͖͕ͨϚγϯʹͱͬͯૣ͗ͨ͢

Slide 25

Slide 25 text

͜͜·Ͱͷ·ͱΊ • StackྖҬͱHeapྖҬ͕͋Δ • HeapྖҬͷม਺ͷण໋ΛͲ͏΍ͬͯ؅ཧ͢Δ ͔ͷ໰୊ • खಈ => GC (=> ϗϯτ͸C++ͷεϚʔτϙΠϯλ΋͋Δ͚ͲׂѪ) ҆શੑͱ଎౓ͷτϨʔυΦϑ

Slide 26

Slide 26 text

RustͷΞϓϩʔν • ଎౓ͱ҆શੑΛཱ྆ͤ͞Δ • GC͸༻͍ͳ͍ • ม਺ͷण໋ͷ؅ཧʹର͠ɺॴ༗ݖγεςϜͰ ղܾΛࢼΈͨ

Slide 27

Slide 27 text

RustͷϝϞϦϞσϧ • RustͷDefault͸Stack΁ͷAllocate BEES OBNF WBM O ʜ ϝϞϦStack 1 struct Foo { 2 pub n: u32, 3 } 4 5 impl Foo { 6 fn new() -> Foo { 7 Foo { n: 42 } 8 } 9 } 10 11 fn main() { 12 let foo = Foo::new(); 13 let bar = 12; 14 } ←Start

Slide 28

Slide 28 text

RustͷϝϞϦϞσϧ • RustͷDefault͸Stack΁ͷAllocate BEES OBNF WBM O ʜ CBS GPP 'PP\O^ ϝϞϦStack 1 struct Foo { 2 pub n: u32, 3 } 4 5 impl Foo { 6 fn new() -> Foo { 7 Foo { n: 42 } 8 } 9 } 10 11 fn main() { 12 let foo = Foo::new(); 13 let bar = 12; 14 }

Slide 29

Slide 29 text

RustͷϝϞϦϞσϧ • RustͷDefault͸Stack΁ͷAllocate BEES OBNF WBM O ʜ Stack 1 struct Foo { 2 pub n: u32, 3 } 4 5 impl Foo { 6 fn new() -> Foo { 7 Foo { n: 42 } 8 } 9 } 10 11 fn main() { 12 let foo = Foo::new(); 13 let bar = 12; 14 }←͜͜Ͱղ์

Slide 30

Slide 30 text

ϝϞϦϞσϧʢؔ਺ݺͼग़͠ʣ 1 fn bar() { 2 let a = 10; 3 let b = 15; 4 println!("{}", a + b); 5 } 6 7 fn main() { 8 let foo = Foo::new(); 9 bar(); 10 } 11 BEES OBNF WBM O ʜ Stack

Slide 31

Slide 31 text

ϝϞϦϞσϧʢؔ਺ݺͼग़͠ʣ 1 fn bar() { 2 let a = 10; 3 let b = 15; 4 println!("{}", a + b); 5 } 6 7 fn main() { 8 let foo = Foo::new(); 9 bar(); 10 } 11 BEES OBNF WBM O ʜ GPP 'PP\O^ Stack ←call

Slide 32

Slide 32 text

ϝϞϦϞσϧʢؔ਺ݺͼग़͠ʣ 1 fn bar() { 2 let a = 10; 3 let b = 15; 4 println!("{}", a + b); 5 } 6 7 fn main() { 8 let foo = Foo::new(); 9 bar(); 10 } 11 BEES OBNF WBM O ʜ C B GPP 'PP\O^ Stack ←call bar()ͷstack frame

Slide 33

Slide 33 text

ϝϞϦϞσϧʢؔ਺ݺͼग़͠ʣ 1 fn bar() { 2 let a = 10; 3 let b = 15; 4 println!("{}", a + b); 5 } 6 7 fn main() { 8 let foo = Foo::new(); 9 bar(); 10 } 11 BEES OBNF WBM O ʜ GPP 'PP\O^ Stack ← end

Slide 34

Slide 34 text

ϝϞϦϞσϧʢؔ਺ݺͼग़͠ʣ 1 fn bar() { 2 let a = 10; 3 let b = 15; 4 println!("{}", a + b); 5 } 6 7 fn main() { 8 let foo = Foo::new(); 9 bar(); 10 } 11 BEES OBNF WBM O ʜ Stack ← end

Slide 35

Slide 35 text

Heap Allocation • ΋ͪΖΜHeap Allocation΋Ͱ͖Δ • std::boxed::BoxΛ࢖͏ 1 use std::boxed::Box; 2 fn boxed_foo() -> Box { 3 Box::new(Foo::new()) 4 } 5 fn main() { 6 let foo = boxed_foo(); 7 println!("{}", foo.n); 8 }

Slide 36

Slide 36 text

BoxΛ࢖ͬͨͱ͖ͷϝϞϦ BEES OBNF WBM O ʜ BEES OBNF WBM Stack heap 1 use std::boxed::Box; 2 fn boxed_foo() -> Box { 3 Box::new(Foo::new()) 4 } 5 fn main() { 6 let foo = boxed_foo(); 7 println!("{}", foo.n); 8 }

Slide 37

Slide 37 text

BoxΛ࢖ͬͨͱ͖ͷϝϞϦ BEES OBNF WBM O ʜ GPP Š BEES OBNF WBM Stack heap 1 use std::boxed::Box; 2 fn boxed_foo() -> Box { 3 Box::new(Foo::new()) 4 } 5 fn main() { 6 let foo = boxed_foo(); 7 println!("{}", foo.n); 8 } ←call

Slide 38

Slide 38 text

BoxΛ࢖ͬͨͱ͖ͷϝϞϦ BEES OBNF WBM O ʜ GPP Š BEES OBNF WBM Stack heap 1 use std::boxed::Box; 2 fn boxed_foo() -> Box { 3 Box::new(Foo::new()) 4 } 5 fn main() { 6 let foo = boxed_foo(); 7 println!("{}", foo.n); 8 } ←call

Slide 39

Slide 39 text

BoxΛ࢖ͬͨͱ͖ͷϝϞϦ BEES OBNF WBM O ʜ GPP Š BEES OBNF WBM " 'PP\O^ Stack heap 1 use std::boxed::Box; 2 fn boxed_foo() -> Box { 3 Box::new(Foo::new()) 4 } 5 fn main() { 6 let foo = boxed_foo(); 7 println!("{}", foo.n); 8 } ←call

Slide 40

Slide 40 text

BoxΛ࢖ͬͨͱ͖ͷϝϞϦ BEES OBNF WBM O ʜ GPP " BEES OBNF WBM " 'PP\O^ Stack heap 1 use std::boxed::Box; 2 fn boxed_foo() -> Box { 3 Box::new(Foo::new()) 4 } 5 fn main() { 6 let foo = boxed_foo(); 7 println!("{}", foo.n); 8 } ←return

Slide 41

Slide 41 text

BoxΛ࢖ͬͨͱ͖ͷϝϞϦ BEES OBNF WBM O ʜ GPP " BEES OBNF WBM " 'PP\O^ Stack heap 1 use std::boxed::Box; 2 fn boxed_foo() -> Box { 3 Box::new(Foo::new()) 4 } 5 fn main() { 6 let foo = boxed_foo(); 7 println!("{}", foo.n); 8 }←End

Slide 42

Slide 42 text

BoxΛ࢖ͬͨͱ͖ͷϝϞϦ BEES OBNF WBM O ʜ GPP " BEES OBNF WBM Stack heap 1 use std::boxed::Box; 2 fn boxed_foo() -> Box { 3 Box::new(Foo::new()) 4 } 5 fn main() { 6 let foo = boxed_foo(); 7 println!("{}", foo.n); 8 }←End ࢀরઌHeapྖҬΛղ์

Slide 43

Slide 43 text

BoxΛ࢖ͬͨͱ͖ͷϝϞϦ BEES OBNF WBM O ʜ BEES OBNF WBM Stack heap 1 use std::boxed::Box; 2 fn boxed_foo() -> Box { 3 Box::new(Foo::new()) 4 } 5 fn main() { 6 let foo = boxed_foo(); 7 println!("{}", foo.n); 8 }←End

Slide 44

Slide 44 text

͜ͷέʔεΛߟ͑ͯΈΑ͏ 1 fn print_n(foo2: Box) { 2 println!("{}", foo2.n); 3 } 4 fn main() { 5 let foo = boxed_foo(); 6 print_n(foo); 7 println!("{}", foo.n); 8 }

Slide 45

Slide 45 text

͜ͷέʔεΛߟ͑ͯΈΑ͏ 1 fn print_n(foo2: Box) { 2 println!("{}", foo2.n); 3 } 4 fn main() { 5 let foo = boxed_foo(); 6 print_n(foo); 7 println!("{}", foo.n); 8 } BEES OBNF WBM O ʜ GPP " BEES OBNF WBM " 'PP\O^ Stack heap

Slide 46

Slide 46 text

͜ͷέʔεΛߟ͑ͯΈΑ͏ 1 fn print_n(foo2: Box) { 2 println!("{}", foo2.n); 3 } 4 fn main() { 5 let foo = boxed_foo(); 6 print_n(foo); 7 println!("{}", foo.n); 8 } BEES OBNF WBM O ʜ GPP " GPP " BEES OBNF WBM " 'PP\O^ Stack heap ←call

Slide 47

Slide 47 text

͜ͷέʔεΛߟ͑ͯΈΑ͏ 1 fn print_n(foo2: Box) { 2 println!("{}", foo2.n); 3 } 4 fn main() { 5 let foo = boxed_foo(); 6 print_n(foo); 7 println!("{}", foo.n); 8 } BEES OBNF WBM O ʜ GPP " GPP " BEES OBNF WBM Stack heap ←End foo2ࢀরઌΛղ์

Slide 48

Slide 48 text

͜ͷέʔεΛߟ͑ͯΈΑ͏ 1 fn print_n(foo2: Box) { 2 println!("{}", foo2.n); 3 } 4 fn main() { 5 let foo = boxed_foo(); 6 print_n(foo); 7 println!("{}", foo.n); 8 } BEES OBNF WBM O ʜ GPP " BEES OBNF WBM Stack heap ← ͜͜

Slide 49

Slide 49 text

͜ͷέʔεΛߟ͑ͯΈΑ͏ 1 fn print_n(foo2: Box) { 2 println!("{}", foo2.n); 3 } 4 fn main() { 5 let foo = boxed_foo(); 6 print_n(foo); 7 println!("{}", foo.n); 8 } BEES OBNF WBM O ʜ GPP " BEES OBNF WBM Stack heap ← !? fooࢀরઌ͕ղ์ࡁʁ

Slide 50

Slide 50 text

͜Ε͸ίϯύΠϧΤϥʔʹͳΔ 1 fn print_n(foo2: Box) { 2 println!("{}", foo2.n); 3 } 4 fn main() { 5 let foo = boxed_foo(); 6 print_n(foo); 7 println!("{}", foo.n); 8 }

Slide 51

Slide 51 text

͜Ε͸ίϯύΠϧΤϥʔʹͳΔ

Slide 52

Slide 52 text

ॴ༗ݖ (ownership) • ॴ༗ݖ = ͦͷΦϒδΣΫτΛղ์͢Δݖར • Rust͸ΦϒδΣΫτͷॴ༗ݖ͸جຊతʹ1ͭͷ ม਺ʹଋറ͞ΕΔ • ҧ൓ͨ͠৔߹͸͢΂ͯίϯύΠϧΤϥʔ

Slide 53

Slide 53 text

͜ͷ࣌ʹfoo͔Βॴ༗ݖফࣦ 1 fn print_n(foo2: Box) { 2 println!("{}", foo2.n); 3 } 4 fn main() { 5 let foo = boxed_foo(); 6 print_n(foo); 7 println!("{}", foo.n); 8 } BEES OBNF WBM O ʜ GPP " GPP " BEES OBNF WBM " 'PP\O^ Stack heap ←call

Slide 54

Slide 54 text

0ͷྖҬ΁ͷΞΫηε͸ېࢭ͞ ΕΔ 1 fn print_n(foo2: Box) { 2 println!("{}", foo2.n); 3 } 4 fn main() { 5 let foo = boxed_foo(); 6 print_n(foo); 7 println!("{}", foo.n); 8 } BEES OBNF WBM O ʜ GPP " GPP " BEES OBNF WBM " 'PP\O^ Stack heap ←call

Slide 55

Slide 55 text

ίϯύΠϥ͕ݕ஌ʂ 1 fn print_n(foo2: Box) { 2 println!("{}", foo2.n); 3 } 4 fn main() { 5 let foo = boxed_foo(); 6 print_n(foo); 7 println!("{}", foo.n); 8 } BEES OBNF WBM O ʜ GPP " GPP " BEES OBNF WBM " 'PP\O^ Stack heap ↑ҧ൓

Slide 56

Slide 56 text

΋͏̍͜ͷέʔε 1 struct Foo { 2 pub n: u32, 3 } 4 impl Foo { 5 fn new() -> Foo { 6 Foo { n: 42 } 7 } 8 } 9 fn main() { 10 let foo = Foo::new(); 11 let bar = foo; 12 println!("{}", foo.n); 13 }

Slide 57

Slide 57 text

͜Ε΋ίϯύΠϧΤϥʔ 1 struct Foo { 2 pub n: u32, 3 } 4 impl Foo { 5 fn new() -> Foo { 6 Foo { n: 42 } 7 } 8 } 9 fn main() { 10 let foo = Foo::new(); 11 let bar = foo; 12 println!("{}", foo.n); 13 } ←͜͜Ͱॴ༗ݖͷҠৡ͕ൃੜ

Slide 58

Slide 58 text

ॴ༗ݖͷҠৡͱ୅ೖ • Rustʹ͓͚Δ `=` ͷҙຯ͸ʮ୅ೖʯͰ͸ͳ͘ɺ
 ʮҠৡʯ (*Copy TraitΛ࣮૷͍ͯ͠ͳ͍৔߹) • ॴ༗ݖ͕Ҡৡ͞Εͨޙͷม਺(foo)ʹର͢Δ
 ૢ࡞͸ίϯύΠϥ͕͢΂ͯ஄͘

Slide 59

Slide 59 text

ࢀরͱआ༻ • Read Onlyͷࢀর
 Λି͠෇͚Δ͜ͱ͕
 Ͱ͖Δ 1 fn print_n(foo: &Foo) { 2 println!("{}", foo.n); 3 } 4 fn main() { 5 let foo = Foo::new(); 6 let a = &foo; 7 let b = &foo; 8 let c = &foo; 9 print_n(a); 10 print_n(b); 11 print_n(c); 12 }

Slide 60

Slide 60 text

ϛϡʔλϒϧࢀর • Write΋Ͱ͖Δࢀর
 # 1͔ͭ͠ି෇ΒΕͳ͍ 1 fn print_n(foo: &mut Foo) { 2 foo.n = 100; 3 println!("{}", foo.n); 4 } 5 fn main() { 6 let mut foo = Foo::new(); 7 let a = &mut foo; 8 // let b = &mut foo; <= ͜Ε͸ίϯύΠϧΤϥʔ 9 print_n(a); 10 }

Slide 61

Slide 61 text

आ༻ͱण໋ • आ༻ઌͷण໋ > आ༻ݩͷण໋
 ͸ίϯύΠϧΤϥʔ 1 fn main() { 2 let a; 3 { 4 let b = 100; 5 a = &b; 6 } 7 println!("{}", a); 8 }

Slide 62

Slide 62 text

৭ʑ • Lifetime Parameter
 ࢀরΛฦ͢ͱ͖ʹ໌ࣔ͢Δܕύϥϝʔλ • ৄ͘͠͸RustͷDocumentΛࢀর… • https://rust-lang-ja.github.io/the-rust- programming-language-ja/1.6/book/ ownership.html

Slide 63

Slide 63 text

RustͷԿ͕ྑ͍ͷ͔ • ॴ༗ݖγεςϜʹΑΔ҆શͳϝϞϦ؅ཧ
 ʢฒྻੑʹ΋د༩ʣ • ϝϞϦ҆શɺσʔλڝ߹҆શΛ͢΂ͯ
 ίϯύΠϥ͕νΣοΫͯ͘͠ΕΔ • (ଞʹ΋) ચ࿅͞ΕͨύλʔϯϚον΍Τϥʔॲ ཧͳͲ

Slide 64

Slide 64 text

͔͜͜Β͸RustΛͲΜͳͱ͜ Ζʹ׆༻͠Α͏ͱ͍ͯ͠Δ͔ Λ஻Γ·͢


Slide 65

Slide 65 text

Rustͷ׆༻Λߟ͑Δ • ߴεϧʔϓοτ͕ٻΊΒΕΔNetwork Middleware • CPU IntensiveͳॲཧΛߦ͏αʔό
 ྫ) ը૾ɾಈըͷEncoding Server
 SSR༻ͷServer

Slide 66

Slide 66 text

ݱࡏݕূ͠Α͏ͱ͍ͯ͠Δ΋ͷ • ը૾ͷಈతม׵αʔό • http://hoge/w/200/h/200/kaicho.jpg original small

Slide 67

Slide 67 text

Event LoopͱCPU intensive • ҰൠతʹɺNode.js͸CPU Intensiveͳॲཧʹ ͸޲͔ͳ͍ͱݴΘΕ͍ͯΔ • CPU Intensive͸ॲཧ͸Event LoopΛετοϓ ͤͯ͞͠·͍ɺεϧʔϓοτΛ௿Լͤͯ͞͠ ·͏ɻ

Slide 68

Slide 68 text

5ISFBE1PPM ʢԾઆʣطଘγεςϜͷ໰୊఺ • Event LoopϞσϧͷαʔόʹCPU Intensiveͳ taskΛ૊ΈࠐΉ৔߹ɺEventLoopΛϒϩοΫ͢ ΔΑ͏ʹ࣮૷͞Ε͍ͯΔέʔε͕ଟ͘ɺεϧʔ ϓοτʹѱӨڹ 5BTL 5BTL &WFOU '4 #MPDLʂ

Slide 69

Slide 69 text

5ISFBE1PPM ॲཧͷΦϑϩʔυ • CPU intensiveͳॲཧ͸BackendͷThread Pool ΁Ϣʔβ͕໌ࣔతʹ౤͛ΒΕΔઃܭ 5BTL 5BTL &WFOU '4

Slide 70

Slide 70 text

Proof of Concepts • tokio-minihttp + ImageMagick Ͱ
 ؆қը૾ม׵αʔόΛߏங • (tokio … RustͰඇಉظIOΛఏڙ͢ΔFW) • ImageMagickΛIO / ThreadͰ࣮ߦ͢Δύλʔϯͱ ผ్֬อ͞ΕͨThread PoolͰ࣮ߦ͢ΔύλʔϯͰ εϧʔϓοτΛܭଌ

Slide 71

Slide 71 text

ݕূ؀ڥ • Digital Ocean্ʹߏஙͨ͠Ubuntu (16.0.4.2) • rustc 1.18.0-nightly (1785bca51 2017-04-21) • Core 2 or 4 • RAM 2GB / 4GB • ಉ؀ڥͷUbuntu͔ΒwrkͰୟ͘

Slide 72

Slide 72 text

݁Ռ (2core) 0 2.25 4.5 6.75 9 10 50 100 EV (2core) EV + MT (2core) ಉ࣌઀ଓ਺ req/s

Slide 73

Slide 73 text

݁Ռ (4core) 0 6 12 18 24 10 50 100 EV (4core) EV + MT (4core) ಉ࣌઀ଓ਺ req/s

Slide 74

Slide 74 text

ߟ࡯ • Event Loop Onlyͷ΋ͷ͸ಉ࣌઀ଓ਺্͕͕Δ ʹͭΕɺεϧʔϓοτ͕ݮগ͢Δ܏޲ • Event Loop + Multi-Threadͷ΄͏͸઀ଓ਺ʹ ର҆͠ఆ • Ծઆͷ࣮ূͷୈ̍า

Slide 75

Slide 75 text

Future Work • httpαʔόࣗମͷ࠶࣮૷ • gzipͳͲͷ࣮૷ • Cache etc… • ͱΓ͋͑ͣ͋ͱ10ഒҎ্͸ૣ͘͠ͳ͚Ε͹
 ࢖͑ͳ͍

Slide 76

Slide 76 text

Conclusion • Rustͷ͞ΘΓ • Heap / Stack • ॴ༗ݖγεςϜ • RustΛ༻͍ͨը૾Τϯίʔυαʔόͷ։ൃ

Slide 77

Slide 77 text

Thank you for listening!