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 ϝϯςφ ˕ º ˚ ˓