The Codest
  • Par mums
  • Pakalpojumi
    • Programmatūras izstrāde
      • Frontend izveide
      • Backend izstrāde
    • Staff Augmentation
      • Frontend izstrādātāji
      • Backend izstrādātāji
      • Datu inženieri
      • Mākoņa inženieri
      • QA inženieri
      • Citi
    • Tā Konsultatīvais dienests
      • Audits un konsultācijas
  • Nozares
    • Fintech un banku darbība
    • E-commerce
    • Adtech
    • Healthtech
    • Ražošana
    • Loģistika
    • Automobiļu nozare
    • IOT
  • Vērtība par
    • CEO
    • CTO
    • Piegādes vadītājs
  • Mūsu komanda
  • Case Studies
  • Zināt, kā
    • Blogs
    • Tikšanās
    • Tiešsaistes semināri
    • Resursi
Karjera Sazinieties ar mums
  • Par mums
  • Pakalpojumi
    • Programmatūras izstrāde
      • Frontend izveide
      • Backend izstrāde
    • Staff Augmentation
      • Frontend izstrādātāji
      • Backend izstrādātāji
      • Datu inženieri
      • Mākoņa inženieri
      • QA inženieri
      • Citi
    • Tā Konsultatīvais dienests
      • Audits un konsultācijas
  • Vērtība par
    • CEO
    • CTO
    • Piegādes vadītājs
  • Mūsu komanda
  • Case Studies
  • Zināt, kā
    • Blogs
    • Tikšanās
    • Tiešsaistes semināri
    • Resursi
Karjera Sazinieties ar mums
Atpakaļ bultiņa ATGRIEZTIES ATPAKAĻ
2022-02-17
Programmatūras izstrāde

Kā palielināt Rails veiktspēju

Konstanty Koszewski

Neraugoties uz daudzajām priekšrocībām, Ruby on Rails joprojām tiek uzskatīts par salīdzinoši lēnu tīmekļa sistēmu. Mēs visi zinām, ka Twitter ir atstājis Rails par labu Scala. Tomēr ar dažiem asprātīgiem uzlabojumiem jūs varat palaist savu lietotni ievērojami ātrāk!

Rubīns pirmais

Rubīns ir izteikti objektorientēta valoda. Patiesībā (gandrīz) viss Rubīns ir objekts. Nevajadzīgu objektu radīšana var radīt jūsu programmai daudz papildu atmiņas izmantošanas izmaksu, tāpēc no tā jāizvairās.

Lai izmērītu atšķirību, mēs izmantosim memory_profiler gem un iebūvētu Benchmark moduli, lai mērītu laika veiktspēju. 

Sprieguma! metožu lietošana virknēm

pieprasīt "memory_profiler"

report = MemoryProfiler.report do
dati = "X" * 1024 * 1024 * 100
data = data.downcase
beigas

report.pretty_print

Tālāk sniegtajā sarakstā mēs izveidojām 100 MB lielu virkni un samazinājām katru tajā ietverto rakstzīmi. Mūsu etalons sniedz šādus rezultātus mums šādu ziņojumu:

Kopā piešķirts: 210765044 baiti (6 objekti)

Tomēr, ja 6. rindu aizstāsim ar:

data.downcase!

Failu lasīšana pa rindiņām

Domājams, mums ir nepieciešams no csv faila iegūt milzīgu datu kopumu ar 2 miljoniem ierakstu. Parasti tas izskatās šādi:

prasīt 'benchmark'

Benchmark.bm do |x|
x.report do
File.readlines("2mrecords.csv").map! {|line| line.split(",")}
beigas
beigas
lietotājs sistēma kopā real

12.797000 2.437000 15.234000 (106.319865)

Lai pilnībā lejupielādētu failu, bija nepieciešamas vairāk nekā 106 sekundes. Diezgan daudz! Bet mēs varam paātrināt šo procesu, aizstājot karte! metodi ar vienkāršu kamēr cilpa:

prasīt 'benchmark'

Benchmark.bm do |x|
x.report do
file = File.open("2mrecords.csv", "r")
while line = file.gets
line.split(",")
end
end
end
lietotājs sistēma kopā real

6.078000 0.250000 6.328000 ( 6.649422)

Darbības laiks tagad ir krasi samazinājies, jo karte! metode pieder konkrētai klasei, piemēram. Hash#map vai Array#map, kur Rubīns saglabās katru analizētā faila rindu atmiņā, kamēr vien tas tiek izpildīts. Ruby's garbage collector neatbrīvos atmiņu, pirms šie iteratori ir pilnībā izpildīti. Tomēr, lasot rindu pa rindai, GC pārvietos atmiņu no iepriekšējām rindām, ja tas nav nepieciešams.

Izvairīšanās no metožu iteratoriem lielākās kolekcijās

Šis punkts ir iepriekšējā punkta turpinājums ar biežāk sastopamu piemēru. Kā jau minēju, Rubīns iteratori ir objekta metodes, un tie neatbrīvo atmiņu, kamēr tiek izpildīti. Nelielā mērogā šī atšķirība ir bezjēdzīga (un metodes, piemēram. karte šķiet vieglāk lasāms). Tomēr, ja runa ir par lielākām datu kopām, vienmēr ir vērts apsvērt iespēju to aizstāt ar vienkāršākām cilpām. Piemēram, kā tālāk dotajā piemērā:

numberofelements = 10000000
randoms = Array.new(numberofelements) { rand(10) }

randoms.each do |line|
#do something
beigas

un pēc refaktorizācijas:

numberofelements = 10000000
randoms = Array.new(numberofelements) { rand(10) }

while randoms.count > 0
line = randoms.shift
#do something
beigas
"`

Izmantojiet metodi String::<<

Šis ir ātrs, bet īpaši noderīgs padoms. Ja pievienojat vienu virkni citai, izmantojot operatoru += aizkulisēs. Rubīns tiks izveidots papildu objekts. Tātad šis: 

 a = "X"
 b = "Y"
 a += b

Patiesībā tas nozīmē:

 a = "X"
 b = "Y"
 c = a + b
 a = c

Operators no tā izvairītos, ietaupot atmiņu:

 a = "X"
 b = "Y"
 a << b

Parunāsim par Rails

Portāls Rails ietvars ir daudz "gotchas", kas ļautu optimizēt jūsu kods ātri un bez lielām papildu pūlēm. 

Nepacietīga ielādēšana AKA n+1 vaicājuma problēma

Pieņemsim, ka mums ir divi saistītie modeļi - Post un Author:

klase Author < ApplicationRecord
has_many :posts
end

klase Post < ApplicationRecord
belong_to :author
end

Mēs vēlamies iegūt visus ierakstus mūsu kontrolierī un parādīt tos skatā ar to autoriem:

kontrolieris

def index
@posts = Post.all.limit(20)
end

apskatīt

Kontrolierī, ActiveRecord izveidos tikai vienu vaicājumu, lai atrastu mūsu ziņojumus. Bet vēlāk tas arī izraisīs vēl 20 vaicājumus, lai atrastu katru autoru, kas aizņems papildu laiku! Par laimi, Rails ir ātrs risinājums, kā apvienot šos pieprasījumus vienā. Izmantojot ietver metodi, mēs varam pārrakstīt mūsu kontrolieri šādi:

 def index
     @posts = Post.all.includes(:author).limit(20)
 end

Pagaidām vienā vaicājumā tiks ielādēti tikai nepieciešamie dati. 

Varat izmantot arī citus dārgakmeņus, piemēram. bullet pielāgot visu procesu.

Zvaniet tikai tam, kas jums nepieciešams

Vēl viens noderīgs paņēmiens ActiveRecord ātruma palielināšanai ir izsaukt tikai tos atribūtus, kas ir nepieciešami jūsu pašreizējiem mērķiem. Tas ir īpaši noderīgi, kad jūsu lietojumprogramma sāk augt un palielinās arī tabulu kolonnu skaits.

Kā piemēru ņemsim mūsu iepriekšējo kodu un pieņemsim, ka mums ir jāizvēlas tikai vārdi no autoriem. Tādējādi mēs varam pārrakstīt mūsu kontrolieri:

 def index
     @posts = Post.all.includes(:author).select("name").limit(20)
 end

Tagad mēs uzdodam savam kontrolierim izlaist visus atribūtus, izņemot mums vajadzīgo.

Pareizi atveidot daļskaitļus

Pieņemsim, ka vēlamies izveidot atsevišķu daļēju sadaļu saviem ziņojumiem no iepriekšējiem piemēriem:


No pirmā acu uzmetiena šis kods izskatās pareizs. Tomēr, ja ir lielāks atveidojamo ziņojumu skaits, viss process būs ievērojami lēnāks. Tas ir tāpēc, ka Sliedes vēlreiz izsauc mūsu daļēju ar jaunu iterāciju. Mēs to varam labot, izmantojot kolekcijas funkcija:

Tagad, Sliedes automātiski noskaidros, kurš šablons jāizmanto, un inicializēs to tikai vienu reizi.

Fona apstrādes izmantošana

Katru procesu, kas aizņem vairāk laika un nav būtisks jūsu pašreizējai plūsmai, var uzskatīt par labu fona apstrādes kandidātu, piemēram, e-pasta vēstuļu sūtīšana, statistikas datu apkopošana vai periodisku pārskatu sniegšana. 

Sidekiq ir visbiežāk izmantotais fona apstrādes dārgakmens. Tas izmanto Redis lai uzglabātu uzdevumus. Tā arī ļauj kontrolēt fona procesu plūsmu, sadalīt tos atsevišķās rindās un pārvaldīt atmiņas izmantošanu katram no tiem.

Rakstiet mazāk koda, izmantojiet vairāk dārgakmeņu

Sliedes nāca klajā ar milzīgu skaitu dārgakmeņiem, kas ne tikai atvieglo jūsu dzīvi un paātrina izstrādes process, bet arī palielināt lietojumprogrammas veiktspējas ātrumu. Tādi dārgakmeņi kā Devise vai Pundit parasti ir labi pārbaudīti attiecībā uz to ātrumu un darbojas ātrāk un drošāk nekā kods, kas rakstīts pēc pasūtījuma šim pašam mērķim.

Jautājumu gadījumā, lai uzlabotu Rails veiktspēja, sasniegt The Codest inženieri ārā, lai konsultētos par savām šaubām.

Ruby izstrādātāja piedāvājums

Lasīt vairāk:

Ruby programmatūras izstrādes plusi un mīnusi

Sliedes un citi transporta līdzekļi

Rails attīstība ar TMUX, Vim, Fzf + Ripgrep

Saistītie raksti

Ilustrācija viedtālruņa veselības aprūpes lietotnei ar sirds ikonu un pieaugošo veselības diagrammu, kas apzīmēta ar The Codest logotipu, kurš pārstāv digitālās veselības un HealthTech risinājumus.
Programmatūras izstrāde

Veselības aprūpes programmatūra: Mārketinga programmatūra: veidi, izmantošanas gadījumi

Šodien veselības aprūpes organizāciju rīcībā esošie rīki vairs neatgādina papīra diagrammas, kas tika izmantotas pirms vairākiem gadu desmitiem. veselības aprūpes programmatūra tagad atbalsta veselības aprūpes sistēmas, pacientu aprūpi un mūsdienīgu veselības aprūpes sniegšanu klīniskajās un...

TĀKĀDĒJAIS
Abstrakta ilustrācija ar lejupejošu joslu diagrammu ar augošu bultiņu un zelta monētu, kas simbolizē izmaksu efektivitāti vai ietaupījumus. Augšējā kreisajā stūrī redzams The Codest logotips ar saukli "In Code We Trust" uz gaiši pelēka fona.
Programmatūras izstrāde

Kā paplašināt izstrādātāju komandu, nezaudējot produkta kvalitāti

Palielināt izstrādātāju komandu? Uzziniet, kā augt, nezaudējot produkta kvalitāti. Šajā rokasgrāmatā aplūkotas pazīmes, kas liecina, ka ir pienācis laiks paplašināt komandu, komandas struktūra, pieņemšana darbā, vadība un rīki, kā arī tas, kā The Codest var...

TĀKĀDĒJAIS
Programmatūras izstrāde

Uz nākotni noturīgu tīmekļa lietojumprogrammu veidošana: The Codest ekspertu komandas ieskats

Uzziniet, kā The Codest izceļas mērogojamu, interaktīvu tīmekļa lietojumprogrammu izveidē, izmantojot modernākās tehnoloģijas un nodrošinot viengabalainu lietotāja pieredzi visās platformās. Uzziniet, kā mūsu zināšanas veicina digitālo transformāciju un biznesa...

TĀKĀDĒJAIS
Programmatūras izstrāde

Top 10 Latvijā bāzēti programmatūras izstrādes uzņēmumi

Mūsu jaunākajā rakstā uzziniet vairāk par Latvijas labākajiem programmatūras izstrādes uzņēmumiem un to inovatīvajiem risinājumiem. Uzziniet, kā šie tehnoloģiju līderi var palīdzēt uzlabot jūsu biznesu.

thecodest
Uzņēmumu un mērogošanas risinājumi

Java programmatūras izstrādes pamati: A Guide to Outsourcing Successfully

Izpētiet šo būtisko rokasgrāmatu par veiksmīgu outsourcing Java programmatūras izstrādi, lai uzlabotu efektivitāti, piekļūtu speciālajām zināšanām un sekmīgi īstenotu projektus ar The Codest.

thecodest

Abonējiet mūsu zināšanu bāzi un saņemiet jaunāko informāciju par IT nozares pieredzi.

    Par mums

    The Codest - starptautisks programmatūras izstrādes uzņēmums ar tehnoloģiju centriem Polijā.

    Apvienotā Karaliste - Galvenā mītne

    • 303B birojs, 182-184 High Street North E6 2JA
      Londona, Anglija

    Polija - Vietējie tehnoloģiju centri

    • Fabryczna Office Park, Aleja
      Pokoju 18, 31-564 Krakova
    • Brain Embassy, Konstruktorska
      11, 02-673 Varšava, Polija

      The Codest

    • Sākums
    • Par mums
    • Pakalpojumi
    • Case Studies
    • Zināt, kā
    • Karjera
    • Vārdnīca

      Pakalpojumi

    • Tā Konsultatīvais dienests
    • Programmatūras izstrāde
    • Backend izstrāde
    • Frontend izveide
    • Staff Augmentation
    • Backend izstrādātāji
    • Mākoņa inženieri
    • Datu inženieri
    • Citi
    • QA inženieri

      Resursi

    • Fakti un mīti par sadarbību ar ārējo programmatūras izstrādes partneri
    • No ASV uz Eiropu: Kāpēc Amerikas jaunuzņēmumi nolemj pārcelties uz Eiropu?
    • Tehnoloģiju ārzonas attīstības centru salīdzinājums: Tech Offshore Eiropa (Polija), ASEAN (Filipīnas), Eirāzija (Turcija)
    • Kādi ir galvenie CTO un CIO izaicinājumi?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Website terms of use

    Autortiesības © 2026 The Codest. Visas tiesības aizsargātas.

    lvLatvian
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian es_ESSpanish nl_NLDutch etEstonian elGreek pt_PTPortuguese cs_CZCzech lt_LTLithuanian lvLatvian