共用方式為


基準版本:效能不佳的應用程式

用來計算更新的初始效能不佳程式碼範例如下所示:

注意

為了簡單起見,下列範例中沒有錯誤處理。 任何生產應用程式一律會檢查傳回值。

 

警告

應用程式的前幾個範例提供刻意不佳的效能,以說明程式碼變更可能改善的效能。 請勿在應用程式中使用這些程式碼範例;它們僅供說明之用。

 

#include <windows.h>

BOOL Map[ROWS][COLS];

void LifeUpdate()
{
    ComputeNext( Map );
    for( int i = 0 ; i < ROWS ; ++i )     //serialized
        for( int j = 0 ; j < COLS ; ++j )
            Set( i, j, Map[i][j] );    //chatty
}

BYTE Set(row, col, bAlive)
{
    SOCKET s = socket(...);
    BYTE byRet = 0;
    setsockopt( s, SO_SNDBUF, &Zero, sizeof(int) );
    bind( s, ... );
    connect( s, ... );
    send( s, &row, 1 );
    send( s, &col, 1 );
    send( s, &bAlive, 1 );
    recv( s, &byRet, 1 );
    closesocket( s );
    return byRet;
}

在此狀態中,應用程式具有最差的網路效能。 此版本的範例應用程式的問題包括:

  • 應用程式很閒聊。 每個交易太小 , 儲存格不需要逐一更新。
  • 交易會嚴格序列化,即使可以同時更新儲存格也一樣。
  • 傳送緩衝區會設定為零,而應用程式會針對每個傳送產生 200 毫秒的延遲,每個儲存格有三次。
  • 應用程式很繁重,每個資料格都會連接一次。 應用程式會因為 TIME-WAIT 狀態而限制特定目的地每秒的連線數目,但這不是這裡的問題,因為每個交易會佔用超過 600 毫秒。
  • 應用程式很豐富;許多交易不會影響伺服器狀態,因為許多儲存格不會從更新變更為更新。
  • 應用程式呈現不佳的串流;小型傳送會耗用大量 CPU 和 RAM。
  • 應用程式會假設其傳送的端端標記法。 這是目前 Windows 平臺的自然假設,但對於長期程式碼而言可能很危險。

關鍵效能計量

下列效能計量會以 RTT) 、Goodput 和通訊協定額外負荷 (來表示。 如需這些詞彙的說明,請參閱 網路術語 主題。

  • 資料格時間,單一儲存格更新的網路時間,Nagle 和延遲的 ACK 互動需要 4*RTT + 600 毫秒。
  • Goodput 小於 6 個位元組。
  • 通訊協定額外負荷為 99.6%。

改善緩慢的應用程式

網路術語

修訂 1:清除明顯

修訂 2:重新設計較少的連線

修訂 3:壓縮區區塊轉送

未來改善