The Codest
  • O nás
  • Služby
    • Vývoj softwaru
      • Vývoj frontendů
      • Vývoj backendu
    • Staff Augmentation
      • Vývojáři frontendů
      • Vývojáři backendu
      • Datoví inženýři
      • Cloudoví inženýři
      • Inženýři QA
      • Další
    • To Advisory
      • Audit a poradenství
  • Odvětví
    • Fintech a bankovnictví
    • E-commerce
    • Adtech
    • Healthtech
    • Výroba
    • Logistika
    • Automobilový průmysl
    • IOT
  • Hodnota za
    • CEO
    • CTO
    • Manažer dodávek
  • Náš tým
  • Case Studies
  • Vědět jak
    • Blog
    • Setkání
    • Webové semináře
    • Zdroje
Kariéra Spojte se s námi
  • O nás
  • Služby
    • Vývoj softwaru
      • Vývoj frontendů
      • Vývoj backendu
    • Staff Augmentation
      • Vývojáři frontendů
      • Vývojáři backendu
      • Datoví inženýři
      • Cloudoví inženýři
      • Inženýři QA
      • Další
    • To Advisory
      • Audit a poradenství
  • Hodnota za
    • CEO
    • CTO
    • Manažer dodávek
  • Náš tým
  • Case Studies
  • Vědět jak
    • Blog
    • Setkání
    • Webové semináře
    • Zdroje
Kariéra Spojte se s námi
Šipka zpět ZPĚT
2022-02-17
Vývoj softwaru

Jak zvýšit výkon systému Rails

Konstanty Koszewski

I přes své četné výhody je Ruby on Rails stále považován za relativně pomalý webový framework. Všichni víme, že Twitter opustil Rails ve prospěch Scaly. S několika chytrými vylepšeními však můžete svou aplikaci spustit výrazně rychleji!

Ruby First

Ruby je výrazně objektově orientovaný jazyk. Ve skutečnosti je v něm (téměř) všechno Ruby je objekt. Vytváření nepotřebných objektů může váš program stát spoustu dodatečné spotřeby paměti, proto je třeba se mu vyhnout.

K měření rozdílu použijeme memory_profiler gem a integrovaný modul Benchmark pro měření časového výkonu. 

Použití metod bang! na řetězce

require "memory_profiler"

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

report.pretty_print

V níže uvedeném výpisu jsme vytvořili 100MB řetězec a zmenšili každý znak v něm obsažený. Náš benchmark dává následující výsledky nás následující zprávu:

Celkem přiděleno: 210765044 bajtů (6 objektů)

Nahradíme-li však řádek 6 tímto:

data.downcase!

Čtení souborů řádek po řádku

Údajně potřebujeme načíst obrovskou kolekci dat o 2 milionech záznamů ze souboru csv. Typicky by to vypadalo takto:

vyžadovat 'benchmark'

Benchmark.bm do |x|
x.report do
File.readlines("2mrecords.csv").map! {|line| line.split(",")}
konec
konec
uživatel systém celkem reálný

12.797000 2.437000 15.234000 (106.319865)

Úplné stažení souboru trvalo více než 106 sekund. To je docela dost! Tento proces však můžeme urychlit nahrazením souboru mapa! s jednoduchou metodou zatímco smyčka:

vyžadovat 'benchmark'

Benchmark.bm do |x|
x.report do
file = File.open("2mrecords.csv", "r")
while line = file.gets
line.split(",")
end
end
end
uživatel systém celkem reálný

6.078000 0.250000 6.328000 ( 6.649422)

Doba běhu se nyní výrazně snížila, protože mapa! metoda patří do určité třídy, jako např. Hash#map nebo Array#map, kde Ruby uloží každý řádek analyzovaného souboru do paměti, dokud je prováděn. Sběrač odpadků v jazyce Ruby neuvolní paměť dříve, než budou tyto iterátory zcela provedeny. Čtení řádek po řádku však způsobí, že GC přemístí paměť z předchozích řádků, pokud to není nutné.

Vyhnout se iterátorům metod ve větších kolekcích

Tento bod je rozšířením předchozího bodu o běžnější příklad. Jak jsem se již zmínil, Ruby iterátory jsou objektové metody a neuvolňují paměť, dokud jsou prováděny. V malém měřítku je tento rozdíl bezvýznamný (a metody jako např. mapa se zdá být čitelnější). Pokud však jde o větší soubory dat, je vždy dobré zvážit, zda je nenahradit základnějšími smyčkami. Jako na příkladu níže:

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

randoms.each do |line|
#do something
konec

a po refaktorizaci:

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

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

Použijte metodu String::<<

Jedná se o rychlý, ale mimořádně užitečný tip. Pokud připojíte jeden řetězec k druhému pomocí operátoru += v pozadí. Ruby vytvoří další objekt. Takže toto: 

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

Ve skutečnosti to znamená toto:

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

Operátor by se tomu vyhnul a ušetřil by vám paměť:

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

Promluvme si o systémech Rails

Na stránkách Rámec Rails má spoustu "gotchas", které by vám umožnily optimalizovat vaše kód rychle a bez větší námahy. 

Dychtivé načítání AKA problém n+1 dotazů

Předpokládejme, že máme dva přidružené modely, Post a Author:

třída Author < ApplicationRecord
has_many :posts
end

třída Post < ApplicationRecord
belongs_to :author
end

Chceme načíst všechny příspěvky v našem kontroléru a zobrazit je v zobrazení s jejich autory:

řídicí jednotka

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

zobrazit

V ovladači, ActiveRecord vytvoří pouze jeden dotaz pro vyhledání našich příspěvků. Později však také vyvolá dalších 20 dotazů, aby podle nich našel každého autora - což zabere další čas! Naštěstí Rails přichází s rychlým řešením, jak tyto dotazy spojit do jediného. Pomocí příkazu obsahuje můžeme náš kontrolér přepsat tímto způsobem:

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

Prozatím se do jednoho dotazu načtou pouze potřebná data. 

Můžete také použít jiné drahokamy, např. kulka přizpůsobit celý proces.

Volejte jen to, co potřebujete

Další užitečnou technikou pro zvýšení rychlosti ActiveRecord je volání pouze těch atributů, které jsou nezbytné pro aktuální účely. To je užitečné zejména tehdy, když se vaše aplikace začne rozrůstat a zvýší se i počet sloupců v tabulce.

Vezměme si jako příklad náš předchozí kód a předpokládejme, že potřebujeme vybrat pouze jména autorů. Můžeme tedy přepsat náš kontrolér:

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

Nyní dáme kontroléru pokyn, aby vynechal všechny atributy kromě toho, který potřebujeme.

Správné vykreslování dílčích částí

Řekněme, že chceme vytvořit samostatnou dílčí část pro naše příspěvky z předchozích příkladů:


Na první pohled vypadá tento kód správně. Při větším počtu příspěvků k vykreslení však bude celý proces výrazně pomalejší. Je to způsobeno tím, že Rails znovu vyvolá náš dílčí příkaz s novou iterací. Můžeme to napravit pomocí příkazu sbírky funkce:

Nyní, Rails automaticky zjistí, která šablona má být použita, a inicializuje ji pouze jednou.

Použití zpracování na pozadí

Každý proces, který je časově náročnější a není klíčový pro váš aktuální tok, může být považován za vhodného kandidáta pro zpracování na pozadí, např. odesílání e-mailů, shromažďování statistik nebo poskytování pravidelných zpráv. 

Sidekiq je nejčastěji používaným drahokamem pro zpracování na pozadí. Používá Redis k ukládání úkolů. Umožňuje také řídit tok procesů na pozadí, rozdělit je do samostatných front a řídit využití paměti pro každý z nich.

Pište méně kódu, používejte více drahokamů

Rails přišel s obrovským množstvím skvostů, které vám nejen usnadní život a urychlí práci. proces vývoje, ale také zvýšit rychlost výkonu vaší aplikace. Klenoty jako Devise nebo Pundit jsou obvykle dobře otestované, pokud jde o jejich rychlost, a pracují rychleji a bezpečněji než kód napsaný na zakázku pro stejný účel.

V případě jakýchkoli dotazů na zlepšení Výkonnost systému Rails, dosáhnout Inženýři The Codest ven, abyste se poradili o svých pochybnostech.

Nabídka pro vývojáře Ruby

Přečtěte si více:

Výhody a nevýhody vývoje softwaru v jazyce Ruby

Kolejnice a další dopravní prostředky

Vývoj Rails pomocí TMUX, Vim, Fzf + Ripgrep

Související články

Ilustrace zdravotnické aplikace pro chytré telefony s ikonou srdce a rostoucím zdravotním grafem, označená logem The Codest, která představuje digitální zdraví a řešení HealthTech.
Vývoj softwaru

Softwarové vybavení pro zdravotnictví: a případy použití

Nástroje, na které se dnes zdravotnické organizace spoléhají, se v ničem nepodobají papírovým kartám z doby před desítkami let. zdravotnický software dnes podporuje zdravotnické systémy, péči o pacienty a moderní poskytování zdravotní péče v klinických a...

NEJKRÁSNĚJŠÍ
Abstraktní ilustrace klesajícího sloupcového grafu se stoupající šipkou a zlatou mincí symbolizující efektivitu nákladů nebo úspory. V levém horním rohu se zobrazuje logo The Codest se sloganem "In Code We Trust" na světle šedém pozadí.
Vývoj softwaru

Jak rozšířit tým vývojářů bez ztráty kvality produktu

Zvětšujete svůj vývojový tým? Zjistěte, jak růst, aniž byste museli obětovat kvalitu produktu. Tento průvodce se zabývá příznaky, že je čas na škálování, strukturou týmu, najímáním zaměstnanců, vedením a nástroji - a také tím, jak může The Codest...

NEJKRÁSNĚJŠÍ
Vývoj softwaru

Vytváření webových aplikací odolných vůči budoucnosti: postřehy týmu odborníků The Codest

Zjistěte, jak společnost The Codest vyniká při vytváření škálovatelných, interaktivních webových aplikací pomocí nejmodernějších technologií, které poskytují bezproblémové uživatelské prostředí na všech platformách. Zjistěte, jak naše odborné znalosti podporují digitální transformaci a obchodní...

NEJKRÁSNĚJŠÍ
Vývoj softwaru

10 nejlepších lotyšských společností zabývajících se vývojem softwaru

V našem nejnovějším článku se dozvíte o nejlepších lotyšských společnostech zabývajících se vývojem softwaru a jejich inovativních řešeních. Zjistěte, jak mohou tito technologičtí lídři pomoci pozvednout vaše podnikání.

thecodest
Podniková a škálovací řešení

Základy vývoje softwaru v jazyce Java: A Guide to Outsourcing Successfully

Prozkoumejte tuto základní příručku o úspěšném vývoji softwaru outsourcing Java, abyste zvýšili efektivitu, získali přístup k odborným znalostem a dosáhli úspěchu projektu s The Codest.

thecodest

Přihlaste se k odběru naší znalostní databáze a získejte aktuální informace o odborných znalostech z oblasti IT.

    O nás

    The Codest - Mezinárodní společnost zabývající se vývojem softwaru s technologickými centry v Polsku.

    Spojené království - ústředí

    • Kancelář 303B, 182-184 High Street North E6 2JA
      Londýn, Anglie

    Polsko - Místní technologická centra

    • Kancelářský park Fabryczna, Aleja
      Pokoju 18, 31-564 Krakov
    • Brain Embassy, Konstruktorska
      11, 02-673 Varšava, Polsko

      The Codest

    • Home
    • O nás
    • Služby
    • Case Studies
    • Vědět jak
    • Kariéra
    • Slovník

      Služby

    • To Advisory
    • Vývoj softwaru
    • Vývoj backendu
    • Vývoj frontendů
    • Staff Augmentation
    • Vývojáři backendu
    • Cloudoví inženýři
    • Datoví inženýři
    • Další
    • Inženýři QA

      Zdroje

    • Fakta a mýty o spolupráci s externím partnerem pro vývoj softwaru
    • Z USA do Evropy: Proč se americké startupy rozhodly přesídlit do Evropy?
    • Srovnání technických vývojových center v zahraničí: Tech Offshore Evropa (Polsko), ASEAN (Filipíny), Eurasie (Turecko)
    • Jaké jsou hlavní výzvy CTO a CIO?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Website terms of use

    Copyright © 2026 by The Codest. Všechna práva vyhrazena.

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