英語版
このページの英語版を見る

std.experimental.allocator.building_blocks.stats_collector

アロケータは、グローバルおよび呼び出し点ごとのアロケーションに関する有用な統計情報を収集する。 アロケータである。収集される統計は、 の組み合わせを適切に選択することで、静的に設定することができる。 Options の組み合わせを適切に選ぶことで、静的に設定することができる。
Examples:
import std.experimental.allocator.gc_allocator : GCAllocator;
import std.experimental.allocator.building_blocks.free_list : FreeList;
alias Allocator = StatsCollector!(GCAllocator, Options.bytesUsed);
enum Options: ulong;
StatsCollector のオプションは以下に定義されている。それぞれ、コンパイル時に を有効にする。
numOwns
owns への呼び出し回数をカウントする。
numAllocate
allocate への呼び出し回数をカウントする。すべての呼び出しがカウントされる、 ゼロバイト要求や失敗した要求を含む。
numAllocateOK
成功した、つまり、リクエストと同じ大きさのブロックを返したallocate への呼の数をカウントする。 成功した、つまりリクエストと同じ大きさのブロックを返した。(注: ゼロバイトのリクエストは成功としてカウントされる)。 を成功としてカウントする)。
numExpand
引数や結果に関係なく、expand 。 の呼び出し回数をカウントする。
numExpandOK
展開に成功したexpand の呼び出し回数をカウントする。 展開に成功した。
numReallocate
引数や結果に関係なく、reallocate への呼び出し回数をカウントする。 をカウントする。
numReallocateOK
成功したreallocate の呼び出し回数をカウントする。 (0バイトへの再割り当ては成功としてカウントされる)。
numReallocateInPlace
インプレース再割り当て(メモリは移動しない)になったreallocate 。 (メモリは移動していない)。この数値が再割り当ての総数に近い場合 この数値が再割り当ての総数に近い場合、アロケータが現在のブロックの末尾に大きな空きを見つけたことを示す。 アロケータが現在のブロックの端に空きを見つけるケースが多いことを示す。 の典型的なアロケーション・サイズに比べ、アロケーション単位が大きい。 アプリケーションの典型的なアロケーションサイズに比べて大きい)。
numDeallocate
deallocate への呼び出し回数をカウントする。
numDeallocateAll
deallocateAll への呼び出し回数をカウントする。
numAlignedAllocate
alignedAllocate への呼数をカウントする。すべての呼がカウントされる、 ゼロバイトのリクエストや失敗したリクエストも含む。
numAlignedAllocateOk
成功した、つまりリクエストと同じ大きさのブロックを返した、alignedAllocate への呼の数をカウントする。 成功した、つまりリクエストと同じ大きさのブロックを返した。(注: ゼロバイトのリクエストは成功としてカウントされる)。 を成功としてカウントする)。
numAll
すべてのnumXxx フラグを選択する。
bytesUsed
このアロケータが現在割り当てているバイト数を追跡する。この数は、メモリが割り当てられ メモリが割り当てられたり解放されたりすると、この数値は上下する。 である。
bytesAllocated
allocate 、および によって割り当てられた累計バイト数を追跡する、 expand およびreallocate (拡張をもたらすとき)によって割り当てられたバイト数の合計を追跡する。この この数値は常に増加し、割り当てのトラフィックを示す。累積割り当て解除バイト数を計算するには からbytesUsed を引く。 bytesAllocated.
bytesExpanded
成功した(returndelta )。 expand(b, delta) 成功した(returntrue)。
bytesContracted
成功した形式の呼び出しにおいて、すべてのb.length - sb.length > s の合計を追跡する。 realloc(b, s) を含むすべてのtrue の合計を追跡する( を返す)。コールごとの で割り当て解除されたバイト数も明確にカウントする。 deallocate.
bytesMoved
realloc で割り当て解除されたバイト数も明確にカウントする。 を呼び出した結果移動した全バイトの合計を追跡する。この数値が大きい場合( bytesAllocated に対して)、アプリケーションはより大きな事前割り当てを使用する必要があることを示す。 を使用する必要があることを示す。
bytesNotMoved
への呼び出しの結果として移動しなかった全バイトの合計を追跡する。realloc を呼び出した結果、移動しなかったバイトの合計を追跡する。数値が大きい( bytesAllocated と比較して)場合、アプリケーションは拡張を多用し、移動量を節約していることを示す。 が移動量をかなり節約していることを示す。しかし、この数値が比較的小さく、 しかし、この数値が比較的小さく、bytesSlack が高い場合は、アプリケーショ ンがほとんど利益を得ずにオーバーオールしていることを意味する。 オーバーオールしていることを意味する。
bytesSlack
要求されたバイト数以上に割り当てられた余分なバイト数の合計を測定する。 すなわち、内部フラグメンテーションである。これは現在の 有効なスラックバイト数であり、時間とともに増減する。
bytesHighTide
時間をかけて割り当てられた最大バイト数を測定する。これは アロケータの寸法を決めるのに便利である。
bytesAll
byteXxx すべてのフラグを選択する。
all
上記のすべてのフラグを組み合わせる。
struct StatsCollector(Allocator, ulong flags = Options.all, ulong perCallFlags = 0);
アロケーションに関する追加データを収集するアロケータ。アロケータは、アロケーションに関する追加データを収集する。 各情報はサイズと時間のオーバヘッドを追加するので、統計はコンパイル時 で個別に有効にも無効にもできる。 またはコンパイル時に無効にすることができるflags
numXxx 形式の統計はすべて、発生したイベントのカウントを記録する。 関数の呼び出しや特定の結果など、発生したイベントのカウントを記録する。形式の統計はbytesXxx 形式の統計は、累積サイズを収集する。
さらに、callerSizecallerModulecallerFilecallerLinecallerTime というデータが、それぞれの特定の割り当てに関連付けられている。 このデータは各アロケーションの接頭辞となる。
Examples:
import std.experimental.allocator.building_blocks.free_list : FreeList;
import std.experimental.allocator.gc_allocator : GCAllocator;
alias Allocator = StatsCollector!(GCAllocator, Options.all, Options.all);

Allocator alloc;
auto b = alloc.allocate(10);
alloc.reallocate(b, 20);
alloc.deallocate(b);

import std.file : deleteme, remove;
import std.range : walkLength;
import std.stdio : File;

auto f = deleteme ~ "-dlang.std.experimental.allocator.stats_collector.txt";
scope(exit) remove(f);
Allocator.reportPerCallStatistics(File(f, "w"));
alloc.reportStatistics(File(f, "a"));
writeln(File(f).byLine.walkLength); // 24
Allocator parent;
親アロケータは、そのアロケータが状態を保持していれば直接のメンバとして、そうでなければ。 Allocator.instance のエイリアスとしてアクセスできる。親アロケータは を使うことができる。
alias alignment = Allocator.alignment;
提供されるアラインメントは Allocator.alignment.
Ternary owns(void[] b);
numOwns (インスタンスごと、呼ごと)をインクリメントし、 parent.owns(b) に転送する。
void[] allocate(size_t n);
に転送する。 parent.allocate.インスタンスごとに影響する:numAllocate, bytesUsed bytesAllocated ,bytesSlack,numAllocateOK 、 およびbytesHighTide 。呼び出しごとの影響:numAllocate numAllocateOK 、およびbytesAllocated
void[] alignedAllocate(size_t n, uint a);
転送先 parent.alignedAllocate.インスタンスごとの影響:numAlignedAllocate, bytesUsed bytesAllocated ,bytesSlack,numAlignedAllocateOk 、 およびbytesHighTide 。呼び出しごとの影響:numAlignedAllocate numAlignedAllocateOk 、 およびbytesAllocated に影響する。
bool expand(ref void[] b, size_t delta);
が定義されているかどうかにかかわらず定義される。 Allocator.expandが定義されているかどうかに関わらず定義される。影響 インスタンスに影響する:numExpandインスタンスごとに影響する: ,numExpandOK,bytesExpandedbytesSlack bytesAllocated 、およびbytesUsed 。コールごとに影響を与える: numExpand numExpandOK ,bytesExpanded, および bytesAllocated.
bool reallocate(ref void[] b, size_t s);
が定義されているかどうかにかかわらず定義される。 Allocator.reallocateが定義されているかどうかに関わらず定義される。影響 インスタンスに影響する:numReallocate numReallocateOK, numReallocateInPlace,bytesNotMoved,bytesAllocated, bytesSlack,bytesExpanded, およびbytesContracted 。呼び出しごとに影響する: numReallocate numReallocateOK ,numReallocateInPlacebytesNotMoved bytesExpanded ,bytesContracted, および bytesMoved.
bool deallocate(void[] b);
が定義されているかどうかにかかわらず定義される。 Allocator.deallocateが定義されているかどうかに関わらず定義される。影響 インスタンスに影響する:numDeallocate bytesUsed およびbytesSlack 。 呼ごとに影響する:numDeallocate およびbytesContracted
bool deallocateAll();
が定義されている場合にのみ定義される。 Allocator.deallocateAllが定義されている場合のみ定義される。インスタンスごとおよびコールごとに インスタンスごとおよびコールごとにnumDeallocateAll
pure nothrow @nogc @safe Ternary empty();
Options.bytesUsed が定義されている場合のみ定義される。bytesUsed == 0 を返す。
void reportStatistics(R)(auto ref R output);
インスタンスごとの統計を outputに報告する(例:stdout)。書式は単純である。 書式は単純で、1行に1種類と値、コロンで区切る。 bytesAllocated:7395404
struct PerCallStatistics;
perCallFlags がゼロでない場合に定義される。
string file;

uint line;
呼び出しのファイルと行。
Options[] opts;
収集した統計に対応するオプション。
ulong[] values;
統計の値。opts と同じ長さである。
const string toString();
のような文字列にフォーマットする: mymodule.d(655): [numAllocate:21, numAllocateOK:21, bytesAllocated:324202].
static auto byFileLine();
perCallFlags がゼロでない場合に定義される。監視されているすべての ファイル/行インスタンスを反復する。繰り返しの順序は意味がない(最初の呼び出しでアイテムはリストの先頭に挿入される)。 項目は最初の呼び出し時にリストの先頭に挿入される)。 収集後に統計情報を前処理することが適切かもしれない。
void reportPerCallStatistics(R)(auto ref R output);
perCallFlags がゼロでない場合に定義される。出力(例えば、File )。 収集された呼ごとの統計情報の単純なレポート。