-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
115 lines (96 loc) · 3.86 KB
/
Copy pathProgram.cs
File metadata and controls
115 lines (96 loc) · 3.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Exporters;
using BenchmarkDotNet.Exporters.Csv;
using BenchmarkDotNet.Running;
using ChunkProof.Benchmarks;
using ChunkProof.Diagnostics;
using System.Text;
// Отчёты уезжают в репозиторий, а консоль на разных машинах пишет по-разному:
// где-то CP866, где-то UTF-8. Кодировка задаётся здесь, чтобы файлы везде
// получались одинаковыми.
Console.OutputEncoding = new UTF8Encoding(false);
// Отчёт выбирается первым аргументом, а не поиском слова по всей строке:
// иначе фильтр замеров вроде --filter *Blocks* попал бы в отчёт.
string report = args.Length > 0 ? args[0] : string.Empty;
if (report == "checks")
{
return Checks.Run();
}
if (report == "blocks")
{
return Blocks.Run();
}
if (report == "threshold")
{
return Threshold.Run();
}
if (report == "memory")
{
// Вид и размер чанка идут следующими аргументами. Каждый вид снимается
// своим процессом: иначе первый оставит после себя мусор, а следующий
// покажет прирост, которого не делал.
string? kind = args.Length > 1 ? args[1] : null;
if (!Size(args, 1_000, out int memorySize))
{
return 1;
}
return Memory.Run(kind, memorySize);
}
if (report == "collect")
{
// Число сборок по поколениям. Тоже по процессу на вид: счётчики
// сборщика общие на процесс, и соседний замер сдвинул бы их.
string? kind = args.Length > 1 ? args[1] : null;
if (!Size(args, 21_244, out int collectSize))
{
return 1;
}
return Collections.Run(kind, collectSize);
}
ManualConfig config = ManualConfig.Create(DefaultConfig.Instance)
.AddExporter(MarkdownExporter.GitHub)
.AddExporter(HtmlExporter.Default)
.AddExporter(CsvExporter.Default);
Type[] benchmarks =
[
typeof(ChunkSourceBench),
typeof(ChunkSourceSizeBench),
typeof(ChunkAlternativeBench),
typeof(FirstBlockBench),
typeof(ChunkValueBench),
typeof(ChunkHeldBench),
typeof(ChunkHeldServerBench),
];
BenchmarkSwitcher switcher = BenchmarkSwitcher.FromTypes(benchmarks);
if (args.Length > 0)
{
switcher.Run(args, config);
return 0;
}
switcher.RunAll(config);
return 0;
// Размер чанка разбирается с проверкой, а не через молчаливое значение
// по умолчанию. Имя файла отчёта задаёт скрипт прогона, а размер - этот
// разбор: при опечатке в скрипте файл назывался бы одним размером,
// а содержал замер другого, и заметить это было бы нечем.
static bool Size(string[] arguments, int fallback, out int size)
{
if (arguments.Length <= 2)
{
size = fallback;
return true;
}
if (int.TryParse(arguments[2], out size) && size > 0)
{
return true;
}
Console.WriteLine($"РАЗМЕР ЧАНКА НЕ РАЗОБРАН: {arguments[2]}");
return false;
}
// Все замеры: dotnet run -c Release -f net10.0
// Один класс: dotnet run -c Release -f net10.0 -- --filter *ChunkHeldBench*
// Отчёты: dotnet run -c Release -f net10.0 -- blocks
// dotnet run -c Release -f net10.0 -- threshold
// dotnet run -c Release -f net10.0 -- memory chunkHeld 25000
// dotnet run -c Release -f net10.0 -- collect chunkArray 21244
// dotnet run -c Release -f net10.0 -- checks