Ruby Academy · Oppitunti

Muistin optimointi

Vähennä varauksia.

Oppitunti 3/413 vaihetta

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_objects kasvaa 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 s

Symbolit 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.inspect

Suoratoisto lataamisen sijaan

Koko tiedoston lukeminen muistiin on tuhlailevaa. Suoratoistakaa tiedosto sen sijaan rivi kerrallaan.

  • each_line käsittelee yhden rivin kerrallaan
  • Muistin tarve pysyy vakiona tiedoston koosta riippumatta
text = "line1\nline2\nline3"
text.each_line do |line|
  puts line.strip.upcase
end

Merkkijonojen 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 buffer

Oliopoolit 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.

Aloita maksutta

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

  1. Suorituskyvyn mittaaminen
  2. Profilointityökalut
  3. Muistin optimointi
  4. Yleiset pullonkaulat
← Takaisin: Ruby Academy