ホームページ  >  記事  >  バックエンド開発  >  Golang の http リクエストには時間がかかります

Golang の http リクエストには時間がかかります

PHPz
PHPzオリジナル
2023-05-10 09:25:071168ブラウズ

Golang は、ネットワーク プログラミングに非常に適したプログラミング言語です。 Golang では、net/http など、HTTP リクエストの作成と送信、レスポンスの受信を行う機能を提供する、非常に使いやすい標準ライブラリが提供されています。実際のプロジェクトでは、パフォーマンスの評価と最適化をより適切に実行できるように、HTTP リクエストの消費時間を計算する必要がある場合があります。この記事では、Golang での HTTP リクエストの消費時間を計算する方法を紹介します。

HTTP リクエストに時間がかかる計算

HTTP リクエストにかかる時間を計算する前に、HTTP リクエストのライフ サイクルを理解する必要があります。 HTTPリクエストのライフサイクルは主に以下の4段階に分かれます。

  1. DNS 解決: ドメイン名を IP アドレスに解決します。
  2. TCP 接続: IP アドレスを介して TCP 接続を確立します。
  3. サーバー処理要求: サーバーが処理します。処理のための HTTP リクエスト リソースの検索およびその他の操作
  4. 応答コンテンツの送信: サーバーは応答テキストをクライアントに送信します

Golang では、time# を渡すことができます。標準ライブラリ #Now() 関数の # を使用して、ある時点の時刻を記録し、時差から HTTP リクエストの消費時間を計算します。以下、上記4段階におけるHTTPリクエスト時間の計算方法を順番に紹介していきます。

    DNS 解決には時間がかかります
Golang では、

net.LookupIP() 関数を通じて DNS 解決を実行できます。この関数は、ホスト名をパラメータとして受け取り、それに対応する IP アドレスのリストを返します。 DNS 解決前と DNS 解決後の時点を記録し、その時間差を計算して DNS 解決時間を取得できます。以下は、DNS 解決に時間がかかるサンプル コードです。

start := time.Now()
ips, err := net.LookupIP("www.example.com")
end := time.Now()
if err != nil {
    fmt.Println("Failed to resolve DNS:", err)
    return
}
dnsTime := end.Sub(start)
fmt.Println("DNS resolution time:", dnsTime)

    TCP 接続に時間がかかります
Golang では、

net.Dial() を渡すことができます。 TCP接続を確立する機能。この関数は 2 つのパラメータを受け取ります。最初のパラメータはプロトコル (「tcp」または「tcp4」または「tcp6」) で、2 番目のパラメータはターゲットのホスト名または IP アドレスとポート番号です (例: 「example.com:」)。 80" ")。 TCP 接続が確立される前後の時点を記録し、時差を計算して TCP 接続時間を取得できます。以下は、TCP 接続に時間がかかるサンプル コードです。

start := time.Now()
conn, err := net.Dial("tcp", "www.example.com:80")
end := time.Now()
if err != nil {
    fmt.Println("Failed to connect to server:", err)
    return
}
connTime := end.Sub(start)
fmt.Println("TCP connection time:", connTime)

    サーバーがリクエストを処理するのに時間がかかります
Golang では、## を介して#http.Client

タイプ Do() 関数は、HTTP リクエストを送信して応答を返すことができます。リクエストを送信する前の時点と、レスポンスを受信した後の時点を記録し、その時間差を計算することで、サーバーがリクエストを処理するのにかかる時間を取得できます。以下は、サーバーがリクエストを処理するのに時間がかかるサンプル コードです: <pre class='brush:go;toolbar:false;'>start := time.Now() resp, err := http.Get(&quot;http://www.example.com&quot;) end := time.Now() if err != nil { fmt.Println(&quot;Failed to get response:&quot;, err) return } body, _ := ioutil.ReadAll(resp.Body) defer resp.Body.Close() serverTime := end.Sub(start) fmt.Println(&quot;Server response time:&quot;, serverTime)</pre>

応答コンテンツの送信に時間がかかります
  1. Golang では、## を介して#http.Client
タイプの

Do() 関数は、HTTP リクエストを送信して応答を返すことができます。応答を取得してからの時刻を記録し、応答内容の送信が完了してからの時刻を記録し、その時間差を計算することで応答内容の送信時間の経過時間を求めることができます。以下は、応答コンテンツの送信にかかる時間を示すサンプル コードです。

start := time.Now()
resp, err := http.Get("http://www.example.com")
end := time.Now()
if err != nil {
    fmt.Println("Failed to get response:", err)
    return
}
body, _ := ioutil.ReadAll(resp.Body)
defer resp.Body.Close()
transferTime := end.Sub(start)
fmt.Println("Server response time:", transferTime)
上記の 4 つの段階で費やされた時間の合計が、HTTP リクエストにかかる合計時間になります。上記のコード スニペットを組み合わせると、HTTP リクエストに費やされた合計時間を計算できます。以下は、HTTP リクエストの合計時間を計算するサンプル コードです。
start := time.Now()
ips, err := net.LookupIP("www.example.com")
if err != nil {
    fmt.Println("Failed to resolve DNS:", err)
    return
}

conn, err := net.Dial("tcp", ips[0].String()+":80")
if err != nil {
    fmt.Println("Failed to connect to server:", err)
    return
}
connTime := time.Now().Sub(start)

req, err := http.NewRequest("GET", "http://www.example.com", nil)
if err != nil {
    fmt.Println("Failed to create HTTP request:", err)
    return
}

start = time.Now()
resp, err := http.DefaultClient.Do(req)
if err != nil {
    fmt.Println("Failed to get response:", err)
    return
}
body, _ := ioutil.ReadAll(resp.Body)
defer resp.Body.Close()
serverTime := time.Now().Sub(start)

transferTime := time.Now().Sub(start)
totalTime := connTime + serverTime + transferTime
fmt.Println("HTTP request total time:", totalTime)

概要

上記は、Golang で HTTP リクエストの時間を計算する方法です。 DNS 解決時間、TCP 接続時間、サーバー処理リクエスト時間、および応答コンテンツ配信時間を個別に計算することで、ネットワーク リクエストのパフォーマンスをより適切に評価し、最適化できます。

以上がGolang の http リクエストには時間がかかりますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。