Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyアプリケーションで何が起こっているのですか?

Rubyアプリケーションで何が起こっているのか疑問に思っているなら…

派手なGUIツールはありません

しかし、ObjectSpaceモジュールがあります!

ObjectSpace アプリケーションの現在の状態に関する情報を提供します。

それがどのように機能するかを発見しましょう。

オブジェクトのカウント

ObjectSpaceの使用 プログラムで現在「生きている」オブジェクトを知ることができます。

オブジェクトが生きているとはどういう意味ですか?

オブジェクトは、それを指す参照がある限り存続します。参照は、変数や定数などのオブジェクトにアクセスするための単なる方法です。

オブジェクトに到達できない場合は、メモリから安全に削除できることを意味します。

# The variable 'name' holds a reference to the string 'Dave'.
name = 'Dave'

# The 'name' variable now points to 'John'.
# 'Dave' no longer has a reference pointing to it.
name = 'John'

次に、ObjectSpaceの例を見てみましょう。 動作中:

require 'objspace'

# This is valid Ruby syntax, but doesn't work on irb/pry
ObjectSpace
  .each_object
  .inject(Hash.new 0) { |h,o| h[o.class] += 1; h }
  .sort_by { |k,v| -v }
  .take(10)
  .each { |klass, count| puts "#{count.to_s.ljust(10)} #{klass}" }


# Copy & paste version (use this for irb/pry)
ObjectSpace.each_object.inject(Hash.new 0) { |h,o| h[o.class] += 1; h }.sort_by { |k,v| -v }.take(10).each { |klass, count| puts "#{count.to_s.ljust(10)} #{klass}" }

これにより、上位10クラスのオブジェクト数を含むテーブルが出力されます。

Count      Class
-------------------------
5436       String
315        Class
251        Array
101        Encoding
69         Regexp
45         Hash
26         Module
25         Gem::Version
22         Gem::StubSpecification::StubLine
22         Gem::StubSpecification

メモリリークが疑われる場合は、このデータを1時間ごとにログに記録し、常に増加し続けるが減少しないオブジェクト数があるかどうかを確認できます。

オブジェクトを楽しむ

ObjectSpaceを使用する場合 オブジェクトに関する情報だけでなく、実際のオブジェクトにアクセスできるため、すべての文字列の値を印刷したり、すべてのFileのパスを印刷したりするなど、楽しいことができます。 オブジェクト。

ObjectSpace
  .each_object(String)
  .sort_by { |s| s.size }
  .each { |s| p s }

これにより、サイズでソートされたすべてのメモリ内文字列が出力されます。自分で作成したのではなく、Rubyインタープリターによって作成された文字列がたくさんあることに気付くでしょう。

実用的な用途は?

さて、これは主にあなたのアプリに関する統計をデバッグして収集するためのものです🙂

オブジェクトのメモリサイズ

もう1つできることは、ObjectSpace.memsize_ofを使用することです。 特定のオブジェクトのメモリサイズを見つけるため。

o = "a" * 100
ObjectSpace.memsize_of(o)

覚えておくべきことの1つは、ドキュメントからのこの警告です:

「返品サイズが不完全であることに注意してください。この情報はヒントとしてのみ扱う必要があります。」

さまざまな種類のオブジェクトでこのメソッドを試してみると、興味深いことがいくつか見つかりますFixnumのように sは常に0を返します。

ObjectSpace.memsize_of(42)
# 0

これは、Rubyが内部でFixnumを作成しないためです。 オブジェクトについては、Rubyの数値について書いた投稿で詳しく知ることができます。

もう1つの興味深いものは文字列です:

ObjectSpace.memsize_of("A" * 22)
# 40

ObjectSpace.memsize_of("A" * 23)
# 40

ObjectSpace.memsize_of("A" * 24)
# 65

"A" * sizeを使用しています 入力せずに長い文字列を作成する方法として🙂

待って!何が起こったのですか?

そうですね、Rubyには24文字未満の文字列に対する最適化が組み込まれていることがわかりました。そのため、その後メモリ使用量が急増します。これについては、PatShaughnessyのこの投稿で詳しく見ることができます。

エイリアスメソッドを見つける方法

Rubyのすべてのエイリアスメソッドの「マスター」リストがあればいいと思いませんか?

よろしくお願いします!

これを見てください

class Module
  def aliased_methods
    instance_methods(false)
      .group_by { |m| instance_method(m) }
      .map(&:last)
      .keep_if { |symbols| symbols.length > 1 }
  end
end

Stackoverflowの回答からこのコードを取得しました。 aliased_methodsを定義します Moduleのメソッド instance_methodsを使用するクラス クラスで定義されているすべてのインスタンスメソッドのリストを取得するメソッド。

少し紛らわしいように聞こえるかもしれませんが、それはあなたにとってメタプログラミングです!

これが残りのコードで、少なくとも1つの「生きている」オブジェクトを持つすべてのクラス名の配列を構築し、aliased_methodsを呼び出します。 すべてのクラスで&出力を出力します。

objects = ObjectSpace.each_object.map(&:class).uniq

objects.each do |klass|
   methods = "n#{klass}n#{'-'*20}n"

   klass.send(:aliased_methods).each do |m1, m2|
     methods << "#{m1.to_s.ljust(15)} #{m2}n"
   end

   puts methods
end

出力は次のようになります

Array
--------------------
inspect         to_s
[]              slice
length          size
find_index      index
collect         map
collect!        map!

結論

ObjectSpaceでできるすばらしいことを楽しんでいただけたでしょうか。 、今すぐ試してみて、何か面白いものがあれば教えてください!

この投稿をプログラマーの友達全員と共有することを忘れないでください。彼らが何か新しいことを学ぶのに役立ち、より多くの読者を獲得するのに役立ちます🙂


  1. Ruby on Railsとは何ですか?なぜそれが役立つのですか?

    Ruby on Rails(RoRの場合もある)は、最も人気のあるオープンソースのWebアプリケーションフレームワークです。 Rubyプログラミング言語で構築されています。 Railsを使用すると、単純なものから複雑なものまで、アプリケーションの構築に役立ちます。Railsで実行できることには制限がありません。 フレームワークとは何ですか? フレームワークは、ソフトウェアを作成するときに使用する特定の構造を提供するコード、ツール、およびユーティリティのコレクションです。 この構造により、コードがより整理されます。 正しく使うことを学ぶと、作業が簡単になります。 レールは正確に何を

  2. Windows ログオン アプリケーションとは?

    Windows オペレーティング システムでは、コンピューターでの作業中に多くのプロセスが実行されています。 Runtime Broker、システム割り込み、DWM などのプロセスに精通している必要があります。これらのすべてのプロセスには独自の重要性があり、Windows コンピューターの通常の操作に関与しています。 知っておくべき最も重要なプロセスの 1 つは、Windows ログオン アプリケーションまたは winlogon.exe です。 Windows ログオン アプリケーションとは何か、そしてその重要性について疑問に思っているはずです。そのすべてを知っておきましょう! Windo