Muistin optimointi
Vähennä varauksia.
Muistin optimointi on ilmainen Ruby Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Ruby Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Ruby Academy-kurssilla on yhteensä 4 oppituntia.
Miksi muistilla on merkitystä
Jokainen Rubyn luoma olio kuluttaa muistia ja lisää roskienkeräyksen työtä. Harvemmat varaukset tarkoittavat nopeampia ja kevyempiä ohjelmia.
- GC keskeyttää suorituksen olioiden vapauttamiseksi
- Suuri varaustahti käynnistää GC:n useammin
- Varausten vähentäminen on usein tehokkain parannus
before = GC.stat(:total_allocated_objects)
100.times { 'new string' + '!' }
after = GC.stat(:total_allocated_objects)
puts "Allocated: #{after - before} objects"Varausten laskeminen
GC.stat tarjoaa varausten laskurit, joiden arvoja voitte verrata lohkon ympärillä.
:total_allocated_objectskasvaa jatkuvasti- Mitattavan osion varausten määrä selviää vertaamalla ennen- ja jälkeen-arvoja
def allocations
before = GC.stat(:total_allocated_objects)
yield
GC.stat(:total_allocated_objects) - before
end
puts allocations { Array.new(1000) { |i| i.to_s } }Jäädytetyt merkkijonoliteraalit
Jokainen toistuva merkkijonoliteraali allokoi uuden olion. Jäädyttämällä ne Ruby voi käyttää uudelleen yhtä muuttumatonta instanssia.
- Lisätkää taikakommentti tiedoston alkuun
- Tai kutsukaa yksittäisille literaaleille
.freeze
# frozen_string_literal: true
s1 = 'hello'
s2 = 'hello'
puts s1.equal?(s2)Allokointien välttäminen silmukoissa
Olioiden luominen tiiviissä silmukoissa moninkertaistaa allokoinnit. Nostakaa vakiot silmukan ulkopuolelle.
- Luokaa regexit, taulukot ja merkkijonot kerran
- Käyttäkää niitä uudelleen iteraatioiden aikana
PATTERN = /\d+/
def count_numbers(lines)
lines.count { |line| line.match?(PATTERN) }
end
puts count_numbers(['a1', 'bb', 'c3'])Muuttavat metodit (bang)
Metodit ilman bangia palauttavat uusia olioita; bang-metodit muuttavat oliota paikallaan ja säästävät allokointeja.
map!,gsub!,sort!- Käyttäkää niitä vain, kun alkuperäisen olion muuttaminen on turvallista
arr = [3, 1, 2]
arr.sort!
puts arr.inspect
s = 'hello world'
s.upcase!
puts sSymbolit vai merkkijonot avaimina
Symbolit ovat internöityjä: sama symboli on yksi jaettu olio. Käyttäkää niitä hashin avaimina.
- Merkkijonoavaimet allokoivat joka kerta uuden merkkijonon
- Symbolit säästävät muistia toistuvissa hauissa
puts :name.equal?(:name)
puts 'name'.equal?('name')Laiskat enumeraattorit
map- ja select-kutsujen ketjuttaminen luo väliaikaisia taulukoita. lazy käsittelee alkiot yksi kerrallaan.
- Väliaikaisia kokoelmia ei allokoida
- Sopii erinomaisesti suurille tai äärettömille sarjoille
result = (1..Float::INFINITY).lazy
.select { |n| n.even? }
.map { |n| n * n }
.first(5)
puts result.inspectSuoratoisto lataamisen sijaan
Koko tiedoston lukeminen muistiin on tuhlailevaa. Suoratoistakaa tiedosto sen sijaan rivi kerrallaan.
each_linekäsittelee yhden rivin kerrallaan- Muistin tarve pysyy vakiona tiedoston koosta riippumatta
text = "line1\nline2\nline3"
text.each_line do |line|
puts line.strip.upcase
endMerkkijonojen yhdistäminen
Merkkijonojen rakentaminen silmukassa +-operaattorilla allokoi joka kerta uuden merkkijonon. Käyttäkää <<-operaattoria liittämiseen paikallaan.
+luo uuden olion<<muuttaa olemassa olevaa puskuria
buffer = String.new
5.times { |i| buffer << "item#{i} " }
puts bufferOliopoolit ja uudelleenkäyttö
Käyttäkää kalliit oliot uudelleen sen sijaan, että loisisitte ne uudelleen.
- Välimuistittakaa jäsennetyt asetukset tai käännetyt regexit
- Käyttäkää vakiota tai memoisoitua arvoa
def config
@config ||= { host: 'localhost', port: 4567 }
end
puts config.equal?(config)GC:n käynnistäminen optimoinnin arviointia varten
Voitte tarkastella GC:n toimintaa parannusten varmistamiseksi.
GC.stat(:count)näyttää suoritettujen GC-ajojen määrän- Optimoinnin jälkeinen ajojen määrän väheneminen on hyvä merkki
start = GC.stat(:count)
50_000.times { |i| [i] }
puts "GC runs: #{GC.stat(:count) - start}"Pikatarkistus
Testatkaa muistinkäsittelyn optimointiin liittyvät tietonne.
Kertaus
Opitte optimoimaan muistinkäyttöä:
- Laskekaa allokoinnit komennolla
GC.stat - Jäädyttäkää merkkijonoliteraalit ja käyttäkää oliot uudelleen
- Suosikaa bang-metodeja ja
<<-operaattoria uusien olioiden välttämiseksi - Käyttäkää symboleja avaimina ja laiskoja enumeraattoreita käsittelyketjuissa
- Suoratoistakaa suuret tietomäärät sen sijaan, että lataisitte kaiken muistiin
Seuraavaksi käsittelette yleisiä suorituskyvyn pullonkauloja.
Opi Ruby tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 29
- Oppitunnit
- 109
Usein kysytyt kysymykset
Onko oppitunti ”Muistin optimointi” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Ruby Academy-oppimispolun 3 oppituntia, myös oppitunnin “Muistin optimointi”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Ruby Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Muistin optimointi”?
Vähennä varauksia. Harjoittelet Ruby Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Ruby Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Ruby Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.
Kuinka kauan ”Muistin optimointi”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Ruby Academy-oppitunnilla?
Kyllä. Jokainen Ruby Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Suorituskyvyn mittaaminen
- Profilointityökalut
- Muistin optimointi
- Yleiset pullonkaulat