.NET 7에서는 프로젝트 설정에 다음과 같이
<PropertyGroup>
...
<TieredPGO>true</TieredPGO>
...
</PropertyGroup>
설정을 주면 간단히 동적 PGO를 활성화 할 수 있습니다. 이를 테스트 하기 위해 다음과 같은 간단한 프로그램을 작성했습니다.
// decimal로 1부터 100000000 까지 더하는 것으로 퍼포먼스 측정
using System.Diagnostics;
Test();
Thread.Sleep(2000);
Console.WriteLine();
Test();
Thread.Sleep(2000);
Console.WriteLine();
Test();
Thread.Sleep(2000);
Console.WriteLine();
Test();
Thread.Sleep(2000);
Console.WriteLine();
Test();
static void Test()
{
var sum = 0m;
var sw = Stopwatch.StartNew();
for (var i = 1m; i <= 100000000m; i++)
sum += i;
var elpsedMs = sw.ElapsedMilliseconds;
Console.WriteLine(sum);
Console.WriteLine($"{elpsedMs} ms");
}
위의 설정 없이 돌리면 제 컴퓨터에서,
5000000050000000
1567 ms
5000000050000000
1511 ms
5000000050000000
1507 ms
5000000050000000
1506 ms
5000000050000000
1487 ms
대략 1500 ms
가 소요되는 것을 확인할 수 있는데요, 위의 설정을 활성화하면,
5000000050000000
1320 ms
5000000050000000
1269 ms
5000000050000000
1268 ms
5000000050000000
1269 ms
5000000050000000
1272 ms
대략 1280 ms
으로 17%의 성능 향상이 있다는 것을 확인했습니다. 이 참에 PublishAot
설정까지 해서 NativeAOT 성능도 확인해보았습니다.
<PropertyGroup>
...
<PublishAot>true</PublishAot>
...
</PropertyGroup>
5000000050000000
1181 ms
5000000050000000
1180 ms
5000000050000000
1174 ms
5000000050000000
1180 ms
5000000050000000
1231 ms
오, 약간 더 빠르군요.