Bu makalede bu iki dilin performans karşılaştırmasını yaptım. Golang benim halihazırda kullandığım favori dilimdi; kendisiyle pek çok kez API servisi yazdım. .NET Core ise Golang ile performans karşılaştırması yapmak için kullandığım bir framework.
Golang, malum çıktığı dönemde çok popüler olmuş ve ben dahil pek çok kişinin yeni oyuncağı olmuştu. Golang şu anda Docker, Kubernetes, Mattermost ve Minio gibi pek çok büyük projede kullanılmakta.
Diğer yandan .NET Core ise 2016 yılında Microsoft tarafından açık kaynak olarak yayınlanmıştı. Bugüne kadar .NET Framework’ü sırf Microsoft ekosistemine bağımlı olduğu için sıcak bakmamıştım ve Java gibi alternatiflerine yönelmiştim. Microsoft’un son zamanlarda açık kaynak dünyasına yaptığı katkılardan birisi olarak ortaya çıkmasından sonra ise büyük bir hızla geliştirilmeye devam ettiğini ve topluluk desteğinin oldukça yoğun olduğunu gözlemledim. Bugün ise denemek için Linux tabanlı bilgisayara .NET Core’u kurdum. Microsoft’un sitesinde kurulumu hakkında çok detaylı dökümanları var eğer kurmak isterseniz iki adet komut yetiyor. C#‘ı yıllar önce kullanmışlığım olmuştu ve Java’ya çok yakın bir dil olmasından dolayı da yabancılık çekmedim.
Dil yapısı olarak iki dil birbirinden çok farklı özelliklere sahiptir. Golang statik türlü ve OS’a direkt compile edilen bir dildir. Nesne yönelimli değildir ve structure yapısına sahiptir. Açık kaynaklı olan Golang projesi Google tarafından yönetilir ve desteklenir. .NET Core ise bir framework’tür ve C# gibi diller bu framework’e dahildir. C# statik türlü, nesne yönelimli ve .NET bytecode’una compile edilen bir dildir. .NET, Microsoft ekosisteminin vazgeçilemez parçasını oluşturur ve yakın zamanda açık kaynak olarak yayınlanmıştır.
Şimdi sırada performans karşılaştırması var. Performans karşılaştırmasını, iki ayrı dilden aynı görevi yerine getirecek birer HTTP server oluşturarak yapacağım. Karşılaştırma şu şekilde çalışacak;
http://localhost:5000/calculate/{number}
adresindenGET
isteklerine yanıt verecek.number
argümanından aldığı sayıyı farklı matematik işlemleri yapacak ve sonucu JSON formatında olacak.
Karşılaştırma yapmak için ApacheBench‘i şu komut ile kullandım;
ab -n 200000 -c 1000 http://localhost:5000/calculate/2222
Golang testi
HTTP sunucu için mux paketini kullandım çünkü built-in net/http
paketinde request path için argüman parsing yapılmamakta.
package main
import (
"encoding/json"
"log"
"net/http"
"strconv"
"github.com/gorilla/mux"
)
type Result struct {
Double int `json:"double"`
Half int `json:"half"`
Square int `json:"square"`
Cube int `json:"cube"`
}
func (c *Result) calculate(num int) *Result {
c.Double = num * 2
c.Half = num / 2
c.Square = num * num
c.Cube = num * num * num
return c
}
func CalculateHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
num, _ := strconv.Atoi(vars["number"])
var res Result
json.NewEncoder(w).Encode(res.calculate(num))
}
func main() {
router := mux.NewRouter()
router.HandleFunc("/calculate/{number}", CalculateHandler)
srv := &http.Server{
Handler: router,
Addr: "127.0.0.1:5000",
}
log.Fatal(srv.ListenAndServe())
}
Kullanılan Go versiyonu: go version go1.16.2 linux/amd64
Önce sunucuyu çalıştırdım ve ardından ab
testini başlattım:
go get github.com/gorilla/mux
go run main.go
Golang için sonuç:
Concurrency Level: 1000
Time taken for tests: 5.831 seconds
Complete requests: 200000
Failed requests: 0
Total transferred: 36200000 bytes
HTML transferred: 12800000 bytes
Requests per second: 34298.52 [#/sec] (mean)
Time per request: 29.156 [ms] (mean)
Time per request: 0.029 [ms] (mean, across all concurrent requests)
Transfer rate: 6062.53 [Kbytes/sec] received
.NET Core testi
using Microsoft.AspNetCore.Mvc;
namespace DotNet5.Controllers
{
public class Result {
public int Double { get; set; }
public int Half { get; set; }
public int Square { get; set; }
public int Cube { get; set; }
public Result calculate(int num) {
this.Double = num * 2;
this.Half = num / 2;
this.Square = num * num;
this.Cube = num * num * num;
return this;
}
}
[ApiController]
[Route("calculate/{number}")]
[Produces("application/json")]
public class MainController : ControllerBase
{
[HttpGet]
public Result Get(int number)
{
Result res = new Result();
return res.calculate(number);
}
}
}
<!-- DotNet5.csproj dosyası -->
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<ServerGarbageCollection>true</ServerGarbageCollection>
</PropertyGroup>
</Project>
Önce sunucuyu çalıştırdım ve ardından ab
testini başlattım:
dotnet run -c Release
Kullanılan .NET versiyonu: .NET SDK 5.0.400 ubuntu.20.04-x64
.NET Core için sonuç:
Concurrency Level: 1000
Time taken for tests: 6.907 seconds
Complete requests: 200000
Failed requests: 0
Total transferred: 40400000 bytes
HTML transferred: 12600000 bytes
Requests per second: 28958.21 [#/sec] (mean)
Time per request: 34.533 [ms] (mean)
Time per request: 0.035 [ms] (mean, across all concurrent requests)
Transfer rate: 5712.46 [Kbytes/sec] received
Kazanan; saniyede 34.298 istek ile Golang oluyor. .NET Core ise 28.958 isteğe yanıt verebilmiş. Bu testte Golang, 5.340 fazladan istek almayı başarıyor.
Diğer test ise Benchmark Game ekibi tarafından yapılmış. Bu sefer karşılaştırmalar, HTTP sunucusunun karşılayabildiği istek sayısı yerine, iki dilin yapılması istenilen programların çalışmasını tamamladığı süreye göre hesaplanıyor. İlgili testte Golang 1.17 ile .NET Core 5.0 kullanılmış ve sonucuna göre ise kazanan 8-2’lik skorla .NET Core olmuş.
İlgili test sonucuna bu bağlantıdan ulaşabilirsiniz: https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/go-csharpcore.html