Slide 1

Slide 1 text

+40/"1*ͱ αʔϏεߴ଎Խ

Slide 2

Slide 2 text

ࣗݾ঺հ w 5XJUUFS!MOJ@5
 (JUIVC!MOJU w .FE1FFS&OHJOFFS ʙ  w ޷͖ͳ3BJMTͷϝιου
 QSFTFODF w ݏ͍ͳ3BJMTͷϝιου
 BDDFQUT@OFTUFE@BUUSJCVUFT@GPS

Slide 3

Slide 3 text

ΫϦχοΫ։ۀࢧԉ ϓϥοτϑΥʔϜ

Slide 4

Slide 4 text

෺݅୳͠ ϊ΢ϋ΢ऩू

Slide 5

Slide 5 text

ͭͬͨ͘ػೳ (PPHMF.BQ্Ͱ ෺݅୳͠ ڝ߹ͷఁ࡯ ױऀ਺༧ଌ ͕ͻͱ໨Ͱ෼͔Δ΍ͭ

Slide 6

Slide 6 text

ϦϦʔεޙʹ໰୊͕

Slide 7

Slide 7 text

ͱͯ΋஗͍

Slide 8

Slide 8 text

ද͕ࣔ஗͍  ݕࡧ͔ͯ͠Β෺݅Λදࣔ͢Δ·Ͱʜ ඵʙඵ

Slide 9

Slide 9 text

෺݅୳͠αʔϏε ͳͷʹ ୳͢ͷ͕஗͍ʂ

Slide 10

Slide 10 text

+40/"1*Λ଎͘ʂ ˢຊ೔ͷςʔϚ

Slide 11

Slide 11 text

ݪҼ͸ʁ

Slide 12

Slide 12 text

୹བྷతࢥߟ  ฦ٫͢Δ݅਺ʹൺྫͯ͠ύϑΥʔϚϯεѱԽ

Slide 13

Slide 13 text

୹བྷతࢥߟ  ฦ٫͢Δ݅਺ʹൺྫͯ͠ύϑΥʔϚϯεѱԽ  ύϑΥʔϚϯε໰୊ͱ͍͑͹%# Ͱ ͑ ΂ ͑

Slide 14

Slide 14 text

୹བྷతࢥߟ  %#पΓͷΑ͋͘ΔରԠΛ΍ͬͯ΋Βͬͨ  JOEFYுΔ  / ͳ͘͢

Slide 15

Slide 15 text

ղܾʂ ΊͰͨ͠ʁ

Slide 16

Slide 16 text

ղܾ͠ͳ͔ͬͨ ෺݅"1*      վળલ վળޙ

Slide 17

Slide 17 text

ͱͯ΋஗͍ˠ஗͍ ඵˠඵ

Slide 18

Slide 18 text

ϘτϧωοΫ୳͠  %#͡Όͳ͍ͳΒʜ Completed 200 OK in 2199ms (Views: 2127.1ms | ActiveRecord: 51.2ms) Completed 200 OK in 2300ms (Views: 2200.7ms | ActiveRecord: 67.0ms)

Slide 19

Slide 19 text

ϘτϧωοΫ୳͠  7JFXT͕஗͍ʂ  KTPOͷϨϯμϦϯά෦෼ʁ (Views: 2127.1ms | ActiveRecord: 51.2ms) (Views: 2200.7ms | ActiveRecord: 67.0ms)

Slide 20

Slide 20 text

+40/γϦΞϥΠζ ͳΜͱ͔͢Δ

Slide 21

Slide 21 text

+40/γϦΞϥΠζ  ʮ"DUJWF.PEFM4FSJBMJ[FSTʯΛར༻͍ͯͨ͠  ࿝ฮHFNͰ࢖͍΍͍͢  ύϑΥʔϚϯε໘ͰଞHFNͱൺֱ͞Ε͕ͪ  KCVJMEFSΑΓ͸଎͍ͷ͕ͩʜ

Slide 22

Slide 22 text

৐Γ׵͑ʂ

Slide 23

Slide 23 text

ͦ΋ͦ΋ +40/γϦΞϥΠβ Կ࢖͑͹͍͍ʁ໰୊

Slide 24

Slide 24 text

ௐࠪ

Slide 25

Slide 25 text

ଟछଟ༷ͳબ୒ࢶ

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

+40/γϦΞϥΠβ ઓࠃ࣌୅

Slide 28

Slide 28 text

ൺֱ

Slide 29

Slide 29 text

ൺֱ  ൺֱର৅  KCVJMEFS  "DUJWF.PEFM4FSJBMJ[FST ".4   GBTU@KTPOBQJ  KC

Slide 30

Slide 30 text

KCVJMEFS # app/views/messages/show.json.jbuilder json.content format_content(@message.content) json.(@message, :created_at, :updated_at) json.author do json.name @message.creator.name.familiar json.email_address @message.creator.email_address_with_name json.url url_for(@message.creator, format: :json) end json.comments @message.comments, :content, :created_at

Slide 31

Slide 31 text

KCVJMEFS  (PPE  3BJMTσϑΥϧτ౥ࡌ ৽نϝϯόͷֶशίετ௿   ϝϯς͞Ε͍ͯΔ 3BJMTίΞνʔϜ   ೚ҙͷεΩʔϚͰฦ٫Ͱ͖Δ  #BE  ௿଎ʜ  ಠಛͳه๏͕ͳ͡·ͳ͍ਓ΋ଟ͍  0UIFS  (*U)VCελʔ਺L

Slide 32

Slide 32 text

".4 class PostSerializer < ActiveModel::Serializer attributes :title, :body has_many :comments has_one :author end class CommentSerializer < ActiveModel::Serializer attributes :name, :body belongs_to :post end

Slide 33

Slide 33 text

".4  (PPE  4FSJBMJ[FSΫϥεͷ࣮૷ςετ͕Մೳ  ೚ҙͷεΩʔϚͰฦ٫Ͱ͖Δ  #BE  ϝϯςφϯε͞Ε͍ͯͳ͍  0UIFS  KCVJMEFSΑΓ͸଎͍͕ଞHFNͱൺֱ͢Δͱ஗͍  (JU)VCελʔ਺L

Slide 34

Slide 34 text

GBTU@KTPOBQJ class MovieSerializer include FastJsonapi::ObjectSerializer attributes :name, :year has_many :actors belongs_to :owner, record_type: :user belongs_to :movie_type end json_string = MovieSerializer.new(movie).serialized_json

Slide 35

Slide 35 text

GBTU@KTPOBQJ  (PPE  4FSJBMJ[FSΫϥεͷ࣮૷ςετ͕Մೳ  ߴ଎ʂ  #BE  ϝϯςφϯε͞Ε͍ͯͳ͍  ˞ຊՈ͔Β'PSL͞ΕͨϦϙδτϦͰϝϯς͞ΕͯΔ  0UIFS  εΩʔϚ͕+40/"1*ʹݶఆ͞ΕΔ  (JU)VCελʔ਺L

Slide 36

Slide 36 text

GBTU@KTPOBQJ  +40/"1*  +40/ߏ଄ͷن໿  UZQF JEඞਢ  ΞιγΤʔγϣϯ͸
 SFMBUJPOTIJQT 
 JODMVEFE
 Ͱදݱ͢Δ { "data": [{ "type": "articles", "id": "1", "attributes": { "title": "JSON:API paints my bikeshed!" }, "relationships": { "author": { "data": { "type": "people", "id": "9" } }, }, }], "included": [{ "type": "people", "id": "9", "attributes": { "firstName": "Dan", "lastName": "Gebhardt", }, }] }

Slide 37

Slide 37 text

KC # app/views/messages/show.json.jb json = { content: format_content(@message.content), created_at: @message.created_at, updated_at: @message.updated_at, author: { name: @message.creator.name.familiar, email_address: @message.creator.email_address_with_name, url: url_for(@message.creator, format: :json) } } json[:comments] = @message.comments.map do |comment| { content: comment.content, created_at: comment.created_at } end json

Slide 38

Slide 38 text

KC  (PPE  KCVJMEFSΑΓૉ௚ʹ3VCZͬΆ͘ॻ͚Δ  ߴ଎ʂ  ೚ҙͷεΩʔϚͰฦ٫Ͱ͖Δ  ϝϯςφϯε͞Ε͍ͯΔ  #BE  ʮ4FSJBMJ[FSͷςετॻ͖͍ͨʂʯਓ͸߹Θͳ͍͔΋  3FRVFTU4QFD4ZTUFN4QFDͰॻ͘͜ͱʹͳΔ  0UIFS  (JU)VCελʔ਺

Slide 39

Slide 39 text

KCVJMEFS ".4 GBTU@ KTPOBQJ KC ଎౓ º ˓ ˕ ˕ εΩʔϚ ࣗ༝౓ ˓ ˓ ˚ ˓ ςετ ͠΍͢͞ ˚ ˓ ˓ ˚ HFN ϝϯς ˕ º ˚ ˓ ˞ݸਓͷײ૝Ͱ͢

Slide 40

Slide 40 text

ɾТɾʆ  Ͳ͏͠Α͏

Slide 41

Slide 41 text

ࠓճ͸଎౓͕໰୊ͳͷͰ ϕϯνϚʔΫ ΈΜͳ͍͖ͩ͢ CFODINBSLJQT

Slide 42

Slide 42 text

CFODINBSLJQT def benchmark Benchmark.ips do |x| x.report('ams') do render_to_string json: ams_tenants, serializer: Ams::TenantSerializer end x.report('fast_jsonapi') do json = FastJsonapi::TenantSerializer.new(tenants).serialized_json render_to_string json: json end x.report('jb') do render_to_string 'index' end x.compare! end end

Slide 43

Slide 43 text

CFODINBSLJQT  ".4ˠGBTU@KTPOBQJ΍KCʹ৐Γ׵͑Δ͚ͩͰʜ  ഒ଎ݟࠐΈʂ˞EFWFMPQNFOU؀ڥଌఆ  Αͦ͞͏ʂ Comparison: jb: 2.0 i/s fast_jsonapi: 1.8 i/s - 1.10x (± 0.00) slower ams: 1.2 i/s - 1.64x (± 0.00) slower

Slide 44

Slide 44 text

৐Γ׵͑  Ұ෦"1*ͷʮKCʯ΁ͷ৐Γ׵͑Λબ୒  બఆཧ༝  ߴ଎  ೚ҙͷεΩʔϚͰฦ٫Ͱ͖Δ  +4ଆ΋࣮૷ࡁͷͨΊεΩʔϚมߋ͸΍Γͨ͘ͳ͍

Slide 45

Slide 45 text

ຊ൪ϦϦʔε݁Ռ

Slide 46

Slide 46 text

TҎ಺౸ୡʂ "status":200,"duration":449.96,"view":299.48,"db":97.36

Slide 47

Slide 47 text

TҎ಺౸ୡʂ ෺݅"1*      վળલ վળͦͷ վળͦͷ

Slide 48

Slide 48 text

 ΊͰͨ͠ 

Slide 49

Slide 49 text

·ͱΊ

Slide 50

Slide 50 text

֤HFNͷॴײ  KCVJMEFS  ඪ४౥ࡌ͕ڧΈ ֶशίετɺϝϯςφϯεܧଓੑ   ։ൃίετॏࢹ଎౓ʹ໰୊͕ແ͍৔߹ʹ͓͢͢Ί  ࠓޙ৽ͨͳ৐Γ׵͑ઌ͕ݟ͔ͭΔʜ͔΋ʁ  "DUJWF.PEFM4FSJBMJ[FST  ͳΜ͔ͩΜͩ࢖͍΍͍͢  ϝϯς͞Εͯͳ͍ͷ͕ਏ͍ʜ  ࠓ࢖͍͑ͯΔਓ͸ɺ
 ٸ͗৐Γ׵͑ͳͯ͘΋Αͦ͞͏

Slide 51

Slide 51 text

֤HFNͷॴײ  GBTU@KTPOBQJ  ଎౓ॏࢹͷ৔߹ʹ͓͢͢Ί  +40/"1*ͷ੍໿Λڐ༰Ͱ͖ΔͳΒ͹࢖͍΍͍͢  ˞ύονͰಈ࡞Λվม͢Δཪٕ΋  KC  ଎౓ॏࢹͷ৔߹ʹ͓͢͢Ί  7JFXʹ௨ৗͷSVCZͬΆ͘ॻ͘ه๏͕߹͑͹࢖͍΍͍͢

Slide 52

Slide 52 text

·ͱΊ  ϘτϧωοΫ͸ͭͱ͸ݶΒͳ͍ͷͰࠜؾΑ͘վળ͠Α͏  ϓϩμΫτͷ໰୊ɺϏδωεͷঢ়گΛؑΈͯ
 ͦͷ࣌ʑʹ߹ٕͬͨज़બఆΛ͠Α͏  ͲͷΞϓϦʹ΋߹͏+40/γϦΞϥΠβͷܾఆ൛͸
 ೥ݱࡏܾΊΒΕͳͦ͞͏

Slide 53

Slide 53 text

KCVJMEFS ".4 GBTU@ KTPOBQJ KC ଎౓ º ˓ ˕ ˕ εΩʔϚ ࣗ༝౓ ˓ ˓ ˚ ˓ ςετ ͠΍͢͞ ˚ ˓ ˓ ˚ HFN ϝϯςφ ˕ º ˚ ˓