私はすぐにWebアプリケーションを開発する必要があり、特にDやGoなどの言語があるため、インタープリター言語で書くことを何とかする必要がないため、Webで作業するときのパフォーマンスを比較したいという要望がありました(ネットワーク上でテストを見つけることができませんでした新鮮です)。 Dの場合、これはvibe.dであり、Goの場合、理解しているとおり、フレームワークは使用されません。 Go以来、私は「何も」知らないことを知っています。テストアプリケーションは、単にテキスト(データベース、複雑なルーティング、画像なし)を含むページを提供するだけです。
負荷はApache Benchmarkを使用して与えられました。
Dのアプリケーションは標準のバイブアプリケーションです。
source / app.d
そして import vibe.d; shared static this() { auto settings = new HTTPServerSettings; settings.options |= HTTPServerOption.distribute; // vibe settings.port = 8101; settings.bindAddresses = ["::1", "127.0.0.1"]; listenHTTP(settings, &index); } void index(HTTPServerRequest req, HTTPServerResponse res) { auto var = "hello habr"; res.render!("index.dt",var); }
ビュー/ index.dt
アセンブリ: html head body h1 , ! p D is a systems programming language with C-like syntax. = var
dub build --build=release
Goアプリケーションでは、対応するファイルに興味があります
site_test_go.go
そして package main import ( "html/template" "net/http" ) type Page struct { Var string } func indexViewer(w http.ResponseWriter, r *http.Request) { p := Page{Var:"hello habr"} t, _ := template.ParseFiles("index.html") t.Execute(w, p) } func main() { http.HandleFunc("/", indexViewer); http.ListenAndServe(":8100", nil); }
index.html
ビルド: <h1>, !</h1> <p>Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.</p> <div> {{.Var}} </div>
go build site_test_go.go
ロード:
ab -c200 -n50000 http://localhost:8101/
(site_test_goの場合は8100)
始めましょう
Apacheベンチマーク
ドキュメントの長さと一致するように、インデックスファイル用の少し異なるコードが作成されました(明らかに、バイブは応答ヘッダーで何かを伝えます)
ドラン | ゴラン |
---|---|
Server Software: vibe.d/0.7.28
| Server Software:
|
記憶
gnome-system-monitor
を使用して測定を実行しました
ドラン | ゴラン | |
---|---|---|
最初のリクエストの前 | メモリ:680.0KiB
仮想:907.5MiB 居住者:10.2MiB 書き込み可能:343.3MiB 共有:9.5MiB | メモリ:888.0KiB
仮想:110.8MiB 居住者:5.2MiB 書き込み可能:35.7MiB 共有:4.4MiB |
abを実行した後 | メモリ:19.2MiB
仮想:9.5GiB 居住者:28.7MiB 書き込み可能:9.0GiB 共有:9.6MiB | メモリ:6.5MiB
仮想:1.3GiB 居住者:12.5MiB 書き込み可能:1.0GiB 共有:5.9MiB |
CPU使用率
gnome-system-monitor
を使用して測定を実行しました
ドラン | ゴラン |
---|---|
![]() | ![]() |
ソフトウェアバージョン
apr-util-1.5.4-1.fc22.x86_64
DMD64 Dコンパイラv2.071.0
2016年5月22日にビルドされたDUBバージョン0.9.25
バイブ0.7.28
goバージョンgo1.5.4 linux / amd64
結論
ツールのパフォーマンスは実質的に同じです(実際、私は驚いています)。
Dメモリの不調:Goの約3倍。
プロセッサ使用率のグラフに基づいて、Goのタスクスケジューラがより適切に配置されていることを結論付けることができます。コアの負荷をすぐに均等に分散しますが、平均してDのCPU負荷は低くなります。
Dアプリケーションのコンパイルに時間がかかることに注意してください(Web開発の場合、これは不快な瞬間になる可能性があります)。
PS:これはWebパフォーマンスの最初の実験です(一般にWebサインはまだよくありません)。したがって、測定方法や初期条件のエラーを指摘していただければ幸いです=)
D言語愛好家向け
UPD:
ここで、おそらくこのテスト全体で最大の間違いであることに気付きました。 vibe-dはlibevent2を使用し、このテストではそのパフォーマンスを正確に評価します(valgrind / callgrindの結果から判断します)。 そして、私が理解しているように、独自のイベントループ実装があり、サードパーティのライブラリはそのまま使用するよりもパフォーマンスが優れています(valgrindの実行可能ファイルに文字が含まれるようにgoをコンパイルする方法を理解していませんでした、
go build -ldflags "-w" -gcflags "-N -l"
は役に立ちませんでした)。
しかし、とにかく、「箱から出してすぐに」構成をテストすることは、私にとって個人的に興味深いものでした。