window.pipedriveLeadboosterConfig={です。 ベース:'leadbooster-chat.pipedrive.com'、 companyId:11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2、 } ;(function () { var w = window もし (w.LeadBooster) {なら console.warn('LeadBooster already exists') } else { w.LeadBooster = { {. q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: 関数 (n) { { this.q.push({ t: 'o', n: n, h: h }) this.q.push({ t: 't', n: n }) }, } } })() Railsのパフォーマンスを向上させる方法 - The Codest
The Codest
  • 会社概要
  • サービス
    • ソフトウェア開発
      • フロントエンド開発
      • バックエンド開発
    • Staff Augmentation
      • フロントエンド開発者
      • バックエンド開発者
      • データエンジニア
      • クラウドエンジニア
      • QAエンジニア
      • その他
    • アドバイザリー
      • 監査&コンサルティング
  • 産業
    • フィンテック&バンキング
    • E-commerce
    • アドテック
    • ヘルステック
    • 製造業
    • 物流
    • 自動車
    • アイオーティー
  • 価値
    • CEO
    • CTO
    • デリバリー・マネージャー
  • チーム
  • Case Studies
  • ノウハウ
    • ブログ
    • ミートアップ
    • ウェビナー
    • リソース
採用情報 連絡先
  • 会社概要
  • サービス
    • ソフトウェア開発
      • フロントエンド開発
      • バックエンド開発
    • Staff Augmentation
      • フロントエンド開発者
      • バックエンド開発者
      • データエンジニア
      • クラウドエンジニア
      • QAエンジニア
      • その他
    • アドバイザリー
      • 監査&コンサルティング
  • 価値
    • CEO
    • CTO
    • デリバリー・マネージャー
  • チーム
  • Case Studies
  • ノウハウ
    • ブログ
    • ミートアップ
    • ウェビナー
    • リソース
採用情報 連絡先
戻る矢印 戻る
2022-02-17
ソフトウェア開発

Railsのパフォーマンスを向上させる方法

コンスタンティ・コシェフスキ

多くの利点があるにもかかわらず、Ruby on Railsはまだ比較的遅いウェブフレームワークだと考えられている。TwitterがRailsからScalaに移行したことは周知の通りです。しかし、いくつかの巧妙な改良を加えることで、アプリを大幅に高速化することができます!

ルビー・ファースト

ルビー は重厚なオブジェクト指向言語である。実際 ルビー はオブジェクトである。不必要なオブジェクトを作成すると、プログラムに多くのメモリ使用量を追加することになるかもしれないので、避ける必要がある。

その違いを測定するために メモリプロファイラ ジェムと、タイム・パフォーマンスを測定するための内蔵ベンチマーク・モジュール。 

文字列にbang!

require "memory_profiler"

report = MemoryProfiler.report do
データ = "X" * 1024 * 1024 * 100
data = data.downcase
終了

report.pretty_print

以下のリストでは、100MBの文字列を作成し、そこに含まれる各文字をダウンケースしている。ベンチマークの結果は以下の通りである:

割り当てられた合計210765044 バイト (6 オブジェクト)

しかし、6行目をこう置き換えてみよう:

data.downcase!

ファイルを一行ずつ読む

おそらく、200万レコードの巨大なデータコレクションをcsvファイルからフェッチする必要がある。一般的には、次のようになる:

require 'benchmark'

ベンチマーク.bm do |x|
x.report do
File.readlines("2mrecords.csv").map!{|line| line.split(",")}.
終了
終了
ユーザー システム 合計 実質

12.797000 2.437000 15.234000 (106.319865)

ファイルを完全にダウンロードするのに106秒以上かかった。かなりの時間だ!しかし、このプロセスは 地図 メソッドに 同時に ループだ:

require 'benchmark'

ベンチマーク.bm do |x|
x.report do
file = File.open("2mrecords.csv", "r")
while line = file.gets
line.split(",")
終了
終了
終了
ユーザー システム 合計 実質

6.078000 0.250000 6.328000 ( 6.649422)

以来、ランタイムは大幅に短縮された。 地図 のように、特定のクラスに属するメソッドです。 Hash#map または アレイ#mapここで ルビー は、実行されている限り、解析されたファイルのすべての行をメモリー内に保存する。 Rubyのガベージコレクタ は、それらのイテレータが完全に実行される前にメモリを解放することはない。しかし、一行ずつ読むと、GCは不要なときに前の行からメモリを再配置する。

大きなコレクションのメソッド反復子を避ける

これは前回の延長線上で、より一般的な例である。前述したように ルビー イテレーターはオブジェクト・メソッドであり、実行されている間はメモリを解放しない。小規模なものでは、この違いは無意味である(そして、例えば 地図 の方が読みやすい)。しかし、より大きなデータセットになると、より基本的なループに置き換えることを常に検討するのがよいだろう。下の例のように:

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

randoms.eachは|line|を行う。
#何かする
終了

とリファクタリング後:

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

while randoms.count > 0
line = randoms.shift
#何かをする
終了
"`

String::<<メソッドを使用する

これは簡単だが特に役に立つヒントだ。裏で+=演算子を使って文字列を別の文字列に追加する場合。 ルビー は追加のオブジェクトを作成する。つまり、これだ: 

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

つまり、こういうことだ:

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

オペレーターがそれを回避し、メモリーを節約する:

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

Railsについて話そう

について Railsフレームワーク をたくさん持っている。おまけ「を最適化することができる。 コード 手間をかけずに、素早く。 

イーガー・ローディング別名n+1クエリー問題

PostとAuthorという2つの関連モデルがあると仮定しよう:

class Author < ApplicationRecord
has_many :投稿
終了

クラス Post < ApplicationRecord
所属 :author
終了

コントローラですべての投稿を取得し、作者とともにビューにレンダリングしたい:

コントローラー

defインデックス
posts = Post.all.limit(20)
終了

ビュー

とする。
 <%= post.
 %

コントローラーで アクティブレコード は、投稿を見つけるためのクエリーを1つだけ作成します。しかし後で、それぞれの作者を検索するためにさらに20個のクエリを生成することになり、さらに時間がかかります!幸いなことに、Railsにはこれらのクエリを1つにまとめる簡単なソリューションが用意されています。Railsの を含む。 メソッドを使えば、コントローラをこう書き換えることができる:

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

今のところ、必要なデータだけが1つのクエリーに取り込まれる。 

また、次のような他の宝石を使うこともできる。 弾丸 を使用して、プロセス全体をカスタマイズすることができます。

必要なものだけを呼ぶ

ActiveRecordの処理速度を上げるもうひとつの便利なテクニックは、現在の目的に必要な属性だけを呼び出すことだ。これは、アプリが成長し始め、テーブルごとのカラム数が増えてきたときに特に有効です。

先ほどのコードを例にして、著者から名前を選択するだけでいいと仮定してみよう。そこで、コントローラを書き直します:

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

ここで、必要な属性以外のすべての属性をスキップするようにコントローラに指示する。

パーシャルの適切なレンダリング

以前の例とは別の投稿用のパーシャルを作りたいとします:

 <%
  @posts.eachは|post|を行う。
  .
  <%

一見すると、このコードは正しいように見える。しかし、レンダリングする記事の数が多くなると、処理全体が著しく遅くなる。これは レールズ はもう一度新しいイテレーションでパーシャルを呼び出します。この問題は コレクション が特徴だ:

 <%=レンダー@posts %

今すぐだ、 レールズ は自動的にどのテンプレートを使うべきかを判断し、一度だけ初期化する。

バックグラウンド処理を使用する

例えば、電子メールの送信、統計情報の収集、定期的なレポートの提供などである。 

サイドキック はバックグラウンド処理に最もよく使われるgemである。これは レディス を使ってタスクを保存することができる。また、バックグラウンド・プロセスのフローを制御したり、別々のキューに分割したり、それぞれのキューのメモリ使用量を管理したりすることもできる。

より少ないコードで、より多くのgemsを使う

レールズ は、あなたの生活を楽にし、開発プロセスを加速させるだけでなく、アプリケーションのパフォーマンス速度を向上させる膨大な数のgemを開発しました。DeviseやPunditのようなgemは通常、その速度に関して十分にテストされており、同じ目的のためにカスタムで書かれたコードよりも高速かつ安全に動作します。

改善に関するご質問 Railsのパフォーマンスリーチ The Codestエンジニア 疑問点を相談するために。

Ruby開発者オファー

続きを読む

Rubyソフトウェア開発の長所と短所

レールおよびその他の輸送手段

TMUX、Vim、Fzf + RipgrepによるRails開発

関連記事

ソフトウェア開発

将来を見据えたウェブ・アプリケーションの構築:The Codestのエキスパート・チームによる洞察

The Codestが、最先端技術を駆使してスケーラブルでインタラクティブなウェブアプリケーションを作成し、あらゆるプラットフォームでシームレスなユーザー体験を提供することにどのように秀でているかをご覧ください。The Codestの専門知識がどのようにデジタルトランスフォーメーションとビジネス...

ザ・コデスト
ソフトウェア開発

ラトビアを拠点とするソフトウェア開発企業トップ10社

ラトビアのトップソフトウェア開発企業とその革新的なソリューションについて、最新記事でご紹介します。ラトビアの技術リーダーたちがあなたのビジネスをどのように向上させるかをご覧ください。

thecodest
エンタープライズ&スケールアップ・ソリューション

Javaソフトウェア開発の要点:アウトソーシングを成功させるためのガイド

outsourcingのJavaソフトウェア開発を成功させるために不可欠なこのガイドを読んで、The Codestで効率性を高め、専門知識にアクセスし、プロジェクトを成功に導きましょう。

thecodest
ソフトウェア開発

ポーランドにおけるアウトソーシングの究極ガイド

ポーランドのoutsourcingの急増は、経済、教育、技術の進歩がITの成長とビジネス・フレンドリーな環境を促進していることによる。

ザ・コデスト
エンタープライズ&スケールアップ・ソリューション

IT監査ツール&テクニック完全ガイド

IT監査は、安全かつ効率的で、コンプライアンスに準拠したシステムを保証します。その重要性については、記事全文をお読みください。

The Codest
ヤクブ・ヤクボヴィッチ CTO & 共同創設者

ナレッジベースを購読して、IT部門の専門知識を常に最新の状態に保ちましょう。

    会社概要

    The Codest - ポーランドに技術拠点を持つ国際的なソフトウェア開発会社。

    イギリス - 本社

    • オフィス 303B, 182-184 High Street North E6 2JA
      イギリス、ロンドン

    ポーランド - ローカル・テック・ハブ

    • ファブリチュナ・オフィスパーク、アレハ
      ポコジュ18、31-564クラクフ
    • ブレイン・エンバシー, コンストルクトースカ
      11, 02-673 Warsaw, Poland

      The Codest

    • ホーム
    • 会社概要
    • サービス
    • Case Studies
    • ノウハウ
    • 採用情報
    • 辞書

      サービス

    • アドバイザリー
    • ソフトウェア開発
    • バックエンド開発
    • フロントエンド開発
    • Staff Augmentation
    • バックエンド開発者
    • クラウドエンジニア
    • データエンジニア
    • その他
    • QAエンジニア

      リソース

    • 外部ソフトウェア開発パートナーとの協力に関する事実と神話
    • 米国から欧州へ:アメリカの新興企業がヨーロッパへの移転を決断する理由
    • テックオフショア開発ハブの比較:テックオフショア ヨーロッパ(ポーランド)、ASEAN(フィリピン)、ユーラシア(トルコ)
    • CTOとCIOの課題は?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • ウェブサイト利用規約

    著作権 © 2025 by The Codest。無断複写・転載を禁じます。

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