Home | Back


การเปรียบเทียบประสิทธิภาพ web service แบบง่าย ๆ ระหว่าง Rust, Crystal, Dlang, Nim และ Golang

Sunday, 18 September 2016



เนื่องจากได้เริ่มศึกษาภาษารุ่นใหม่เข้าตัวนึงคือ Crystal ซึ่งเป็นภาษาที่ได้แรงบันดาลใจในด้าน syntax จากภาษา Ruby ที่มีรูปแบบภาษาที่น่าใช้ อ่านง่าย และแรงบันดาลใจด้าน concurrency แบบ CSP จากภาษา Go กระนั้นแล้ว ขอทำการทดลองนิด ๆ หน่อย ๆ เพื่อดูว่าภาษา Crystal นี่ ประสิทธิภาพเจ๋งแค่ไหน โดยผมได้นำภาษา Rust, ภาษา D และภาษา Nim เข้าร่วมทดสอบด้วย โดยมีการทดลองดังนี้ครับ

1. การเตรียมเครื่องมือสำหรับการทดลอง

ผมจะทำการทดลองด้วยเครื่อง PC ส่วนตัว โดยจะมี CPU Intel(R) Core(TM) i3-2100 CPU @ 3.10GHz ซึ่งมีขนาด 4 Core แบบ Logical และหน่วยความจำขนาด 8GB ทำงานบนระบบปฏิบัติการ Archlinux แบบ 64 Bits และใช้โปรแกรม wrk สำหรับวัดการตอบสนอง โดยมีผลลัพธ์เป็น Request per Seconds โดยจะกำหนด Threads เป็น 20 กำหนด Concurency เป็น 1000 และ Duration ที่ 5 วินาที โดยจะใช้คำสั่งสำหรับการทดสอบดังนี้ครับ

2. การเตรียมการสำหรับภาษาต่าง ๆ

ผมได้นำ code สำหรับสร้าง web service ที่ตอบสนองเพียงแค่ข้อความว่า “test” แล้ววัดการตอบสนองโดย code ในภาษาต่าง ๆ มีดังนี้ครับ

File : rustweb.rs

extern crate iron;

use iron::prelude::*;
use iron::status;

fn main() {
	fn hello_world(_: &mut Request) -> IronResult<Response> {
		Ok(Response::with((status::Ok, "test")))
	}

	let _server = Iron::new(hello_world).http("localhost:7777").unwrap();
}

File : crweb.cr

require "http/server"

module Crweb
	server = HTTP::Server.new(7777) do |context|
		context.response.content_type = "text/plain"
		context.response.print "test"
	end

	server.listen
end

File : dweb.d

import vibe.d;

shared static this()
{
	auto settings = new HTTPServerSettings;
	settings.port = 7777;
	settings.bindAddresses = ["::1", "127.0.0.1"];
	settings.options |= HTTPServerOption.distribute;
	listenHTTP(settings, &hello);
}

void hello(HTTPServerRequest req, HTTPServerResponse res)
{
	res.writeBody("test");
}

File : goweb.go

package main

import (
	"fmt"
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "test")
}

func main() {
	http.HandleFunc("/", handler)
	http.ListenAndServe(":7777", nil)
}

File : nimweb.nim

import jester, asyncdispatch, htmlgen

routes:
	get "/":
		let headers = {"Content-type": "text/plain"}
		resp Http200, headers, "test"

runForever()
  • ภาษา Rust ใช้รุ่น 1.11.0 และใช้ Iron Web Framework
  • ภาษา Crystal ใช้รุ่น 0.19.1 และใช้ http/server ที่เป็น Standard Library
  • ภาษา D ใช้ DMD64 D Compiler v2.071.1 และใช้ Vibe.d เป็น Web Framework
  • ภาษา Go ใช้รุ่น 1.7.1 และใช้ net/http ที่เป็น Standard Library
  • ภาษา Nim ใช้รุ่น 0.14.2 และใช่ Jester เป็น Web Framework

3. ผลการทดลอง

จากการทดลอง ได้ผลการทดลองเป็นกราฟดังนี้ครับ

compare

จากกราฟจะเห็นว่า Go ทำผลงานได้ดีที่สุด รองลงมาคือ Crystal แต่ที่น่าผิดหวังมากคือ Nim ที่การตอบสนองได้เพียงครึ่งเดียวของ Go

ภาษา Crystal เป็นภาษาใหม่ที่น่าสนใจมาก มีประสิทธิภาพไม่ต่างจาก Go, Rust และ Dlang มากนัก แต่ที่น่าสนใจมาก ๆ คือ syntax ที่ยืมมาจากภาษา Ruby และมีความยืดหยุ่นทางภาษาที่ดี ซึ่งจะทำให้โปรแกรมเมอร์จะมีความสุขในการพัฒนา Algorithm และ System ต่าง ๆ ตอนนี้ภาษา Crystal ยังอยู่ใน Alpha State และยังไม่ออกรุ่น 1.0.0 ซึ่งผมเองคงจะต้องจับตามอง และอาจจะนำมาใช้พัฒนางานต่าง ๆ แทนภาษา Go ก็เป็นได้ครับ



Home | Back