0

Rider、Xunit、および dotMemory Unit を使用して、このようなことをしようとしています (ただし、NUnit または Visual Studio と同様である必要があります)。

[DotMemoryUnit(CollectAllocations = true, FailIfRunWithoutSupport = false)]
[Fact]
private void MemoryTest()
{
  int i = 0;
  MemoryCheckPoint memory1 = dotMemory.Check();
  i++; // standin for something much more complicated
  dotMemory.Check(memory => {
      Assert.Equal(0, memory.GetTrafficFrom(memory1).AllocatedMemory.SizeInBytes);
    });
  _testOutputHelper.WriteLine(i.ToString()); // just here to make sure i gets used
}

明らかにi++、私は本当にテストしたいもっと複雑なものの代用として使用していますが、これを通過させたいと思っています。

私が見ているのは、dotMemory でチェックポイントを取得した結果として多くの割り当てが発生し、それらがすべて表示されることです。Whereクエリを使用することで、JetBrains 名前空間に固有のものを除外できると思います。これは少し役に立ちます。ただし、割り当てられたバイトの大部分は mscorlib のシステム名前空間にあり、それらが私のコードによって作成された場合、それらを除外したくありません。

アロケーションフリー/ガベージフリーのコードを作成するためにテストしようとしているので、アロケーションを追跡して、私のコードが何もしなかったことを主張したいと思っています。

また、 dotMemory.Check() 呼び出しでクロージャーの割り当てをヌードルしようとする道をたどり、それを移動して事前に初期化してもあまり役に立ちません。

私の最新バージョンは、実際には答えに近づいているように見えることなく、はるかに厄介になっています:

MemoryCheckPoint memory1;
string[] myparams = new[] {"JetBrains"};
Func<TrafficProperty, Query> myquery = obj => obj.Namespace.NotLike(myparams);
Action<Memory> myaction = memory => { Assert.Equal(0, memory.GetTrafficFrom(memory1).Where(myquery).AllocatedMemory.SizeInBytes); };
        
int i = 0;

memory1 = dotMemory.Check();
i++;
dotMemory.Check(myaction);
        
_testOutputHelper.WriteLine(i.ToString());

System には、dotMemory 自体によって行われている割り当てがまだたくさんあります。

4

0 に答える 0