2.3. ウォーターマーク

概要

Pia 内部で実際にどれだけのリソースが消費されたかを取得するために、ウォーターマーク機能が用意されています。

例えば PiaTransport では、内部バッファのサイズをアプリケーションが指定できるようになっています。このウォーターマーク機能を用いて、プログラム実行時に内部バッファがどれだけ使用されたかを知ることで、アプリケーションプログラマは適切な内部バッファのサイズを決定でき、メモリを効率的に配分することができます。

利用手順

ウォーターマーク機能を利用するためには、アプリケーションが明示的に WatermarkManager シングルトンのインスタンスを作成する必要があります。シングルトン作成は、 common::BeginSetup() ~ common::EndSetup() 間で実行する必要があります。

コード 2-7. WatermarkManager インスタンス作成
nn::pia::Result result;
result = nn::pia::common::BeginSetup();
PIA_ASSERT(result.IsSuccess());
 
// (他のシングルトンを作成するコード)
// .........
// .........
 
// WatermarkManagerのシングルトン作成
result = nn::pia::common::WatermarkManager::CreateInstance();
PIA_ASSERT(result.IsSuccess());
 
result = nn::pia::common::EndSetup();
PIA_ASSERT(result.IsSuccess());

次に、計測の開始を指示します。

コード 2-8. 計測の開始
nn::pia::common::WatermarkManager::GetInstance()->EnableAllWatermark();

最後に、アプリケーションによる一連の処理を行った後で、対象の計測結果を取得します。以下のコードでは、一例として PiaTransport の送信バッファの計測結果を取得しています。

コード 2-9. 計測結果の取得
nn::pia::common::WatermarkManager* pMgr = nn::pia::common::WatermarkManager::GetInstance();
nn::pia::common::Watermark* pMark = pMgr->GetWatermark(nn::pia::common::WatermarkManager::KeySendthreadstreamBufferNum);
if(pMark->GetUpdateCount() > 0)
{
    PIA_SAMPLE_PRINT("Watermark: <%s> max: %lld, min: %lld, latest: %lld, Updates: %lld\n",
        pMark->GetName(),
        pMark->GetMaxValue(),
        pMark->GetMinValue(),
        pMark->GetLatestValue(),
        pMark->GetUpdateCount()
    );
}

以下に、上記の手順で得られた結果の一例を示します。max: の右脇にある数字が、送信バッファ使用量のピーク値となります。アプリケーションプログラマはこの結果を参考にして、適切な送信バッファのサイズを決めることができます。

コード 2-10. 計測結果の出力
Watermark: <SendThreadStream buffer num> max: 6, min: 0, latest: 0, Updates: 14342

取得可能な値

ウォーターマーク機能で取得可能な値は、 WatermarkManager クラスで KeyXxxYyyZzz のように列挙されている定数に対応するものに限定されます。