Ruby vs Elixir vs Go: Сравнение на паралелността

Изминаха 8 години, откакто започнах работа в Ruby on Rails. За определен период от време Ruby направи толкова много подобрения в производителността, които ни помогнаха да създадем приложения, които се представят добре при прилично натоварване. Въпреки че текущата версия на рубините е по-добра в сравнение с предишните версии, разработчиците не са доволни от производителността, когато създават силно едновременни уеб приложения. Преминах през интернет и много разработчици публикуваха много случаи на използване, в които Ruby не им се поддаваше. Но все пак не съм убеден с мненията, които са дали. Затова реших да направя по-малък експеримент с Ruby, за да знам повече за неговата производителност.

Както всички знаем, за сравнение се нуждаете от повече от един език. И така, аз избирам Golang и Elixir заедно с Ruby. Когато търся за създаване на силно едновременни приложения, повечето резултати ще включват или един от тези езици и освен това тези два езика ми харесват. Golang за своята простота и Elixir заради своите функции Ruby. Така че, без да закъсняваме, нека започнем експеримента.

Използвайте случай: Извличане на документ от AWS Elastic search

Хардуер: MacBook Pro, 2,7 GHz Intel Core i5, 16 GB 1867 MHz DDR3

За този експеримент използвах Sinatra в Ruby с Puma като сървър, стандартна net / http библиотека в Golang и Trot в Elixir.

Ето фрагментите на кода на различни езици.

Руби:

# Версия: 2.4.1p111
изискват 'синатра'
изискват 'elastsearch'
изискват „еластично търсене / транспорт“
получавам '/' правя
  client = Elasticsearch :: Client.new дневник: true, url: ""
  response = client.search index: 'staging_shambas',
                         body: {query: {match: {id: "100"}}}
  response.to_json
край

Golang:

# Версия: 1.10
основен пакет
внос (
 "Контекст"
 "Gopkg.in/olivere/elastic.v5"
 "Влезете"
 "Нетна / HTTP"
 "Кодиране / JSON"
)
func обработвач (w http.ResponseWriter, r * http.Request) {
  ctx: = context.Background ()
  клиент, грешка: = еластична.NewClient (ластик.SetSniff (невярно),
                                   elast.SetURL (""))
 ако греши! = нула {
  // Грешка при работа
  паника (ERR)
 }
 searchResult, грешка: = client.Get ().
  Index ( "staging_shambas"). // търсене в индекс "twitter"
  Тип ( "Шамба").
  Id ( "100").
  Do (CTX)
          
  ако греши! = нула {
   паника (ERR)
  }
  w.Header (). Set ("Тип съдържание", "application / json")
  json.NewEncoder (w) .Encode (searchResult)
}
func main () {
 http.HandleFunc ("/", манипулатор)
 log.Fatal (http.ListenAndServe (": 8080", нула))
}

Еликсир:

# Версия: 1.5.2
демодул EsSearch.Router направи
  използвайте Trot.Router
  импортиране на Tirexs.HTTP
  Trot.Router.get "/ index" направи
    conn = put_resp_content_type (conn, "application / json")
    {: добре, 200,
      records} = Tirexs.HTTP.get ("/ staging_shambas / shamba / 100")
     send_resp (conn, 200, записи |> Poison.encode! ([]))
  край
  import_routes Trot.NotFound
край

За да направя тестване на производителността, използвах инструмент, наречен обсада, подобен на AB (пейка Apache). По-долу е графиката на отговора за едновременни заявки, която варира от 8 до 1023.

Ако забележите графиката, времето за реакция е увеличено до ~ 11сек в Ruby, където, както в Elixir и Golang, е под ~ 3 сек. Ясно, според тази графика, Golang и Elixir са надминали Ruby при голямо натоварване.

Въпреки че Ruby е застанал на последната позиция, аз обичам Ruby, защото неговата езикова семантика, подобна на човешките езици и страхотна подкрепа на общността.

Надявам се това да ви помогне да разберете, че как езиците ще се държат под товар.

Ако ви харесва, оставете отзивите си в секцията за коментари и споделете тази публикация.