Ruby vs Elixir vs Go: Qarama-qarshi taqqoslash

Men Ruby-da relsda ish boshlaganimga 8 yil bo'ldi. Vaqt o'tishi bilan, Ruby juda ko'p yaxshilanishlarni amalga oshirdi, bu bizga munosib yuk ostida yaxshi ishlaydigan dasturlarni yaratishda yordam berdi. Hozirgi yoqutli versiya oldingi versiyalar bilan taqqoslaganda yaxshiroq, lekin ular bir vaqtning o'zida juda mos keladigan veb-dasturlarni yaratishda ishlashdan mamnun emaslar. Men Internetni ko'rib chiqdim va ko'plab ishlab chiquvchilar Ruby ularga bo'ysunmagan holatlar haqida ko'p xabarlarni joylashtirdilar. Ammo, baribir, men ular bergan fikrlarga ishonchim komil emas. Shuning uchun men uning ishlash tomoni haqida ko'proq bilish uchun Ruby bilan kichikroq tajriba o'tkazishga qaror qildim.

Barchamizga ma'lumki, taqqoslash uchun sizga bir nechta til kerak. Shunday qilib, men Rubi bilan birga Golang va Elixirni tanlayman. Bir vaqtning o'zida bir vaqtning o'zida bir-biriga mos keladigan dasturlarni yaratishni izlayotganimda, natijalarning aksariyati shu ikkala tildan biriga to'g'ri keladi va bundan tashqari, menga ushbu ikki til yoqadi. O'zining soddaligi uchun Golang va yoqutga o'xshash xususiyatlari uchun Elixir. Shunday qilib, kechikmasdan tajribani boshlaymiz.

Ishdan foydalanish: AWS Elastik qidiruvidan hujjatni olish

Uskuna: MacBook Pro, 2,7 Gigagertsli Intel Core i5, 16 GB 1867 MGts DDR3

Ushbu tajriba uchun men Sinatra-dan Ruby-da Puma bilan server sifatida, Golang-dagi standart net / http kutubxonasidan va Elixir-dagi Trot-dan foydalandim.

Bu erda turli tillardagi kod parchalari.

Yoqut:

# Versiya: 2.4.1p111
"sinatrani" talab qilish
"elastika" qidirishni talab qiladi
"elasticsearch / transport" ni talab qiladi
olish '/' do
  client = Elasticsearch :: Client.new log: true, url: ""
  javob = mijoz.qidiruv indeksi: 'staging_shambas',
                         tanasi: {so'rov: {mos: {id: "100"}}}
  javob.to_json
oxiri

Golang:

# Versiya: 1.10
paket asosiy
Import (
 "kontekst"
 "gopkg.in/olivere/elastic.v5"
 "jurnal"
 "net / http"
 "kodlash / json"
)
funktsiya ishlovchisi (http .ResponseWriter, r * http.Request) {
  ctx: = context.Background ()
  mijoz, err: = elastik.NewClient (elastik.SetSniff (noto'g'ri),
                                   elastik.SetURL (""))
 agar adashsangiz! = nil {
  // ishlov berish xatosi
  vahima (adashish)
 }
 searchResult, err: = client.Get ().
  Indeks ("staging_shambas"). // "twitter" indeksida qidirish
  Turi ("shamba").
  Id ("100").
  Do (ctx)
          
  agar adashsangiz! = nil {
   vahima (adashish)
  }
  w.Header (). Set ("Tarkib turi", "application / json")
  json.NewEncoder (w) .Encode (searchResult)
}
func main () {
 http.HandleFunc ("/", ishlov beruvchi)
 log.Fatal (http.ListenAndServe (": 8080", nol))
}

Elixir:

# Versiya: 1.5.2
defModule EsSearch.Router do
  Trot.Router-dan foydalaning
  Tirexs.HTTP-ni import qilish
  Trot.Router.get "/ index" do
    conn = put_resp_content_type (conn, "application / json")
    {: yaxshi, 200,
      yozuvlar} = Tirexs.HTTP.get ("/ staging_shambas / shamba / 100")
     send_resp (conn, 200, yozuvlar |> Poison.encode! ([]))
  oxiri
  import_routes Trot.NotFound
oxiri

Unumdorlikni tekshirish uchun qamal deb nomlangan vositadan foydalanganman (Apache bench). Quyida bir vaqtning o'zida 8 dan 1023 gacha o'zgarib turadigan so'rovlar uchun javoblar jadvali keltirilgan.

Agar siz grafikani ko'rsangiz, javob berish vaqti Rubyda ~ 11 sek ga oshirildi, bu erda Elixir va Golangda bu ~ 3 sek. Ko'rinib turibdiki, ushbu grafikka ko'ra, Golang va Elixir og'ir yuk ostida Rubidan yuqori bo'lgan.

Garchi Ruby oxirgi pog'onada tursa-da, men Rubyni juda yaxshi ko'raman, chunki uning inson semantikasiga o'xshash til semantikasi va jamoaning ajoyib qo'llab-quvvatlashi.

Umid qilamanki, bu sizga tillarning yuk ostida qanday ishlashini tushunishga yordam beradi.

Agar sizga yoqsa, fikr-mulohazalaringizni sharhlar bo'limida qoldiring va ushbu xabarni baham ko'ring.