2

これは私のテストケースです。EMは一般的なTCPサーバーよりも高速ではないことがわかりました。

EMサーバー:

    require 'rubygems'
    require 'benchmark'
    require 'eventmachine'
    class Handler  < EventMachine::Connection
      def receive_data(data)
            operation = proc do
                # simulate a long running request
                 a = []
                n = 5000
                for i in 1..n
                    a << rand(n)
                    a.sort!
                end
            end

        # Callback block to execute once the request is fulfilled
        callback = proc do |res|
            send_data "send_response\n"
        end

            puts data
            EM.defer(operation, callback)
      end
    end

    EventMachine::run {
      EventMachine.epoll
      EventMachine::start_server("0.0.0.0", 8080, Handler)
      puts "Listening..."
    }

と私のベンチマークテスト:

require 'rubygems'
require 'benchmark'
require 'socket'
Benchmark.bm do |x|
    x.report("times:") do
        for i in 1..20
            TCPSocket.open "127.0.0.1", 8080 do |s|
                    s.send "#{i}th sending\n", 0    
                if line = s.gets
                    puts line
                end
                puts "#{i}th sending"
            end
        end
    end
end
4

3 に答える 3

3

速度ではなく、スレッドと比較した単純さ。詳細については、こちらをご覧ください:EventMachine:高速でスケーラブルなイベント駆動型I/Oフレームワーク

あなたの質問に当てはまる引用:

イベント駆動型プログラムは理論的にはスレッド化されたプログラムよりも高速ではないという事実について多くのことが書かれていますが、それは事実です。しかし実際には、最大の堅牢性を確保しながら、非常に高いスケーラビリティとパフォーマンスを実現したい場合は、イベント駆動型モデルの方が扱いやすいと思います。私は、クラッシュしたり、メモリリークが発生したり、パフォーマンスが低下したりすることなく、数か月または数年実行する必要のあるプログラムを作成しているため、実際には、イベント駆動型プログラミングの方が適しています。ここで、イベント駆動型プログラミングの問題があります。「逆方向」に記述する必要があります。スレッドモデルは、プログラムの状態をランタイムスタックのローカル変数に(非効率的に)格納します。EMでは、それを自分で行う必要があります。これは、スレッドに慣れているプログラマーにとっては非常に直感的ではありません。これが私が繊維に興味を持っている理由です、

于 2011-04-29T13:14:57.397 に答える
1

昨日、プロジェクトでこの演習を行いました。概念的なハードルはたくさんあります。

IlyaGrigorikによるこのデモRailsアプリをご覧ください。彼は、Apache Benchmarkを使用して、サイトへの複数の訪問者からトラフィックを取得しているかのように、サーバーに同時にアクセスします。これは、eventmachineから利点を得るところです。データベースへのすべての呼び出しを互いに並べる代わりに、それらは非同期で送信され、結果は劇的です。デモをインストールすると、database.ymlでem_mysql2アダプター(高速)をmysql2アダプター(低速)に置き換えることで違いを確認できます。

同様に、ループ内でeventmachineをヒットした場合、ループ自体の同期性(低速)によって制約されます。

于 2011-04-29T15:57:42.480 に答える
0

1つは、EM.run内ではなく、EM.runを使用してイベントループに入る前に、EM.epollを呼び出す必要があることです。

EventMachine.epoll
EventMachine::run {
  EventMachine::start_server("0.0.0.0", 8080, Handler)
  puts "Listening..."
}
于 2014-03-13T02:32:29.927 に答える