Rúbín fyrst
Rúbín er mjög hlutbundið forritunarmál. Reyndar er (næstum) allt í Rúbín er hlutur. Að búa til óþarfa hluti getur kostað forritið þitt mikla auka minnisnotkun, svo þú ættir að forðast það.
Til að mæla muninn munum við nota a minnisgreiningartól göngusteinn og innbyggður Benchmark-modúl til að mæla tímaframmistöðu.
Notaðu bang! aðferðir á strengjum
require "memory_profiler"
report = MemoryProfiler.report do
gögn = "X" * 1024 * 1024 * 100
data = data.downcase
end
report.pretty_print
Í listanum hér að neðan bjuggum við til 100 MB streng og breyttum öllum stöfum í hann í lágstöfur. Viðmiðunartak okkar sýnir okkur eftirfarandi skýrsla:
Heildarúthlutað: 210765044 bæti (6 hlutir)
Hins vegar, ef við skiptum línu 6 út fyrir:
Gögnin eru skráð í lágstöfum!Hljóðskrift
Lesið skrár línu fyrir línu
Sagt er að við þurfum að sækja gríðarlega gagnasafnið sem inniheldur 2 milljón færslur úr CSV-skrá. Venjulega lítur það svona út:
require 'benchmark'
Benchmark.bm do |x|
x.report do
File.readlines("2mrecords.csv").map! {|line| line.split(",")}
end
end
notandi kerfi samtals raunverulegt
12.797000 2.437000 15.234000 (106.319865)
Það tók okkur meira en 106 sekúndur að hlaða skránni niður að fullu. Talsvert mikið! En við getum flýtt fyrir þessu ferli með því að skipta út kort! aðferð með einföldu á meðan hringrás:
require 'benchmark'
Benchmark.bm do |x|
x.report do
file = File.open("2mrecords.csv", "r")
while line = file.gets
line.split(",")
end
end
end
notandi kerfi samtals raunverulegt
6.078000 0.250000 6.328000 ( 6.649422)
Keyrslutíminn hefur nú dregist verulega saman síðan kort! aðferð tilheyrir ákveðnum flokki, eins og Hash#map eða Array#map, þar sem Rúbín mun geyma hverja línu af greindu skránni í minni meðan á framkvæmd stendur. Ruslatökumaður Ruby mun ekki losa minnið fyrr en þessir endurteknarar hafa verið fullkomlega framkvæmdir. Hins vegar mun línufyrir línu lestur kalla á ruslhreinsun (GC) til að færa minnið úr fyrri línum þegar það er ekki nauðsynlegt.
Forðastu aðferðartilvísanir á stærri safnum
Þetta er framlenging á fyrri atriðinu með algengara dæmi. Eins og ég nefndi, Rúbín Íteratorar eru aðferðir hluta og losa ekki minni meðan á þeim stendur. Á smáum skala er munurinn merkingarlaus (og aðferðir eins og kort (virðist læsilegra). Hins vegar, þegar um stærri gagnasöfn er að ræða, er alltaf góð hugmynd að íhuga að skipta því út fyrir einfaldari lykkjur. Eins og í dæminu hér að neðan:
numberofelements = 10000000
randoms = Array.new(numberofelements) { rand(10) }
randoms.each do |line|
#do something
end
og eftir endurskipulagningu:
numberofelements = 10000000
randoms = Array.new(numberofelements) { rand(10) }
while randoms.count > 0
line = randoms.shift
#do something
end
“`
Notaðu String::<< aðferðina.
Þetta er fljótleg en sérstaklega gagnleg ráð. Ef þú bætir einum streng við annan með += rekstrarmerkinu, fer það fram bak við tjöldin. Rúbín mun búa til auka hlut. Svo, þetta:
a = "X"
b = "Y"
a += bHljóðskrift
Þýðir í raun þetta:
a = "X"
b = "Y"
c = a + b
a = cHljóðskrift
Rekandinn myndi forðast það, sem sparar þér minni:
a = "X"
b = "Y"
a << bHljóðskriftHljóðskrift
Tölum um Rails
Þeir Rails-rammi er með gnægð af “gildrur”sem myndi gera þér kleift að hámarka þitt kóði hratt og án of mikillar viðbótar fyrirhafnar.
Furðuálagning (einnig kallað n+1-fyrirspurnavandamál)
Gerum ráð fyrir að við höfum tvö tengd módel, Post og Author:
class Author < ApplicationRecord
has_many :posts
end
class Post < ApplicationRecord
belongs_to :author
end
Við viljum sækja allar færslurnar í stýritækinu okkar og birta þær í sýn með höfundum þeirra:
stýritæki
def index
@posts = Post.all.limit(20)
end
sýn
Í stýritækinu, Virkur skrá mun það búa til aðeins eina fyrirspurn til að finna færslurnar okkar. En síðar mun það einnig kalla á 20 aðrar fyrirspurnir til að finna hvern höfund fyrir sig – sem tekur aukatíma! Sem betur fer fylgir Rails fljótlegri lausn til að sameina þessar fyrirspurnir í eina. Með því að nota innifelur Með þessari aðferð getum við endurskrifað stýritækið okkar svona:
def index
@posts = Post.all.includes(:author).limit(20)
endHljóðskrift
Fyrir nú er aðeins nauðsynlegum gögnum sótt í eina fyrirspurn.
Þú getur einnig notað aðra gimsteina, svo sem kúla að sérsníða allt ferlið.
Hringdu aðeins í það sem þú þarft
Önnur gagnleg aðferð til að auka hraða ActiveRecord er að kalla eingöngu á þau eiginleika sem nauðsynlegir eru fyrir núverandi notkun. Þetta er sérstaklega gagnlegt þegar forritið þitt fer að vaxa og fjöldi dálka í hverri töflu eykst einnig.
Tökum fyrri kóðann okkar sem dæmi og gerum ráð fyrir að við þurfum aðeins að velja nöfn úr höfundum. Svo getum við endurskrifað stýringuna okkar:
def index
@posts = Post.all.includes(:author).select("name").limit(20)
endHljóðskriftHljóðskrift
Nú skipum við stýritækinu okkar að sleppa öllum eiginleikum nema þeim einum sem við þurfum.
Birta hluta rétt
Segjum að við viljum búa til aðskilda hlutastykki fyrir færslurnar okkar úr fyrri dæmum:
@posts.each do |post|
end
HljóðskriftHljóðskriftHljóðskrift
Við fyrstu sýn virðist þessi kóði vera réttur. Hins vegar, þegar fleiri færslur þarf að birta, verður allt ferlið verulega hægara. Þetta er vegna þess að Relsar kallar á hlutdrægni okkar með nýrri endurtekningu enn og aftur. Við getum lagað það með því að nota Safnanir eiginleiki:
Rendera @postsHljóðskriftHljóðskriftHljóðskrift
Núna, Relsar mun sjálfkrafa ákvarða hvaða sniðmát eigi að nota og frumstilla það aðeins einu sinni.
Notaðu bakgrunnsvinnslu
Öll ferli sem eru tímafrek en ekki nauðsynleg fyrir núverandi vinnuflæði þitt gætu talist góðir kostir fyrir bakgrunnsvinnslu, t.d. sending tölvupósta, söfnun tölfræðiupplýsinga eða útgáfa reglubundinna skýrslna.
Saídkík er algengasta gimsteinninn sem notaður er fyrir bakgrunnsvinnslu. Hann notar Redis til að geyma verkefni. Það gerir þér einnig kleift að stjórna flæði bakgrunnsferla þinna, skipta þeim í aðskildar biðraðir og stýra minnisnotkun hvers og eins þeirra.
Ritaðu minna kóða, notaðu fleiri gems
Relsar koma með gríðarlegt magn af gimsteinum sem ekki aðeins gera líf þitt auðveldara og flýta fyrir þróunarferli, en einnig auka afköst og hraða forritsins þíns. Perlur eins og Devise eða Pundit eru yfirleitt vel prófaðar hvað varðar hraða og virka hraðar og öruggar en sérskrifaður kóði fyrir sama tilgang.
Ef einhverjar spurningar koma upp um bætt Frammistaða Rails, ná The Codest verkfræðingar Út til að ráðfæra þig um vafa þína.

Lesa meira: