有没有办法在基准中分别设置每环的每次迭代?
我正在尝试对数据库上不同数量的项目运行基准测试,例如:测试端点的响应时间,以检查项目名称是否已与数据库中的 1 个项目、2、5、10、20、 50、100、200、500、1000。 创建了一个 for 循环来为每个基准测试添加适当数量的项目到数据库中,但一开始实现的迭代设置无法按预期工作,有时对于应该创建 5 个项目的循环部分,却创建了 8 个项目。 有没有办法分别对循环的每个部分进行此设置? 我知道每次测试后都可以使用清理来删除项目,但我真的想避免这种情况,并在项目数量逐渐上升时进行所有测试,然后在测试结束时进行一次清理。
[IterationSetup]
public void GetItemIterationSetup()
{
int numberOfElements = GetNumberOfElements();
if (numberOfElements == 0 || numberOfElements == 1)
{
AddItemToDB(numberOfElements);
Console.WriteLine($"Creating Item: {numberOfElements}");
}
else if (numberOfElements >= 2 && numberOfElements < 5)
{
for (int i = 0; i < 5 - numberOfElements; i++)
{
AddItemToDB(numberOfElements+i);
Console.WriteLine($"Creating Item: {numberOfElements+i}");
}
}
else if (numberOfElements >= 5 && numberOfElements < 10)
{
for (int i = 0; i < 10 - numberOfElements; i++)
{
AddItemToDB(numberOfElements+i);
Console.WriteLine($"Creating Item: {numberOfElements+i}");
}
}
else if (numberOfElements >= 10 && numberOfElements < 20)
{
for (int i = 0; i < 20 - numberOfElements; i++)
{
AddItemToDB(numberOfElements+i);
Console.WriteLine($"Creating Item: {numberOfElements+i}");
}
}
else if (numberOfElements >= 20 && numberOfElements < 50)
{
for (int i = 0; i < 50 - numberOfElements; i++)
{
AddItemToDB(numberOfElements+i);
Console.WriteLine($"Creating Item: {numberOfElements + i}");
}
}
else if (numberOfElements >= 50 && numberOfElements < 100)
{
for (int i = 0; i < 100 - numberOfElements; i++)
{
AddItemToDB(numberOfElements+i);
Console.WriteLine($"Creating Item: {numberOfElements + i}");
}
}
else if (numberOfElements >= 100 && numberOfElements < 200)
{
for (int i = 0; i < 200 - numberOfElements; i++)
{
AddItemToDB(numberOfElements+i);
Console.WriteLine($"Creating Item: {numberOfElements + i}");
}
}
else if (numberOfElements >= 200 && numberOfElements < 500)
{
for (int i = 0; i < 500 - numberOfElements; i++)
{
AddItemToDB(numberOfElements+i);
Console.WriteLine($"Creating Item: {numberOfElements + i}");
}
}
else if (numberOfElements >= 500 && numberOfElements < 1000)
{
for (int i = 0; i < 1000 - numberOfElements; i++)
{
AddItemToDB(numberOfElements+i);
Console.WriteLine($"Creating Item: {numberOfElements + i}");
}
}
}
public IEnumerable<int> GetItemNumberOfElements()
{
yield return 1;
yield return 2;
yield return 5;
yield return 10;
yield return 20;
yield return 50;
yield return 100;
yield return 200;
yield return 500;
yield return 1000;
}
[Benchmark]
[ArgumentsSource(nameof(GetItemNumberOfElements))]
public bool Test1(int count)
{
Console.WriteLine($"Proper number of Items should be: {count}, is: {GetNumberOfElements()}");
CheckIfItemNameIsTakenUseCaseDefinition definition = CheckIfItemNameIsTakenUseCaseComposition.Definition(_telemetryClient);
bool result = definition.Function($"Item{count}").Result;
return result;
}
I'm trying to run benchmarks with different number of items on the database, for example: testing response time of an endpoint for checking if the name of the item already taken with 1 item on the database, 2, 5, 10, 20, 50, 100, 200, 500, 1000.
A for loop was created to add proper number of items to the database for each benchmark but the iteration setup implemented at the beginning does not work as expected and sometimes for part of the loop where 5 items should be created there are 8 instead.
Is there any way to do this setup for each part of the loop separately?
I know that after each test the cleanup can be used to remove items but I really want to avoid that and do all the tests while the number of items is gradually ascending and then do one clean-up at the end of the tests.
[IterationSetup]
public void GetItemIterationSetup()
{
int numberOfElements = GetNumberOfElements();
if (numberOfElements == 0 || numberOfElements == 1)
{
AddItemToDB(numberOfElements);
Console.WriteLine(quot;Creating Item: {numberOfElements}");
}
else if (numberOfElements >= 2 && numberOfElements < 5)
{
for (int i = 0; i < 5 - numberOfElements; i++)
{
AddItemToDB(numberOfElements+i);
Console.WriteLine(quot;Creating Item: {numberOfElements+i}");
}
}
else if (numberOfElements >= 5 && numberOfElements < 10)
{
for (int i = 0; i < 10 - numberOfElements; i++)
{
AddItemToDB(numberOfElements+i);
Console.WriteLine(quot;Creating Item: {numberOfElements+i}");
}
}
else if (numberOfElements >= 10 && numberOfElements < 20)
{
for (int i = 0; i < 20 - numberOfElements; i++)
{
AddItemToDB(numberOfElements+i);
Console.WriteLine(quot;Creating Item: {numberOfElements+i}");
}
}
else if (numberOfElements >= 20 && numberOfElements < 50)
{
for (int i = 0; i < 50 - numberOfElements; i++)
{
AddItemToDB(numberOfElements+i);
Console.WriteLine(quot;Creating Item: {numberOfElements + i}");
}
}
else if (numberOfElements >= 50 && numberOfElements < 100)
{
for (int i = 0; i < 100 - numberOfElements; i++)
{
AddItemToDB(numberOfElements+i);
Console.WriteLine(quot;Creating Item: {numberOfElements + i}");
}
}
else if (numberOfElements >= 100 && numberOfElements < 200)
{
for (int i = 0; i < 200 - numberOfElements; i++)
{
AddItemToDB(numberOfElements+i);
Console.WriteLine(quot;Creating Item: {numberOfElements + i}");
}
}
else if (numberOfElements >= 200 && numberOfElements < 500)
{
for (int i = 0; i < 500 - numberOfElements; i++)
{
AddItemToDB(numberOfElements+i);
Console.WriteLine(quot;Creating Item: {numberOfElements + i}");
}
}
else if (numberOfElements >= 500 && numberOfElements < 1000)
{
for (int i = 0; i < 1000 - numberOfElements; i++)
{
AddItemToDB(numberOfElements+i);
Console.WriteLine(quot;Creating Item: {numberOfElements + i}");
}
}
}
public IEnumerable<int> GetItemNumberOfElements()
{
yield return 1;
yield return 2;
yield return 5;
yield return 10;
yield return 20;
yield return 50;
yield return 100;
yield return 200;
yield return 500;
yield return 1000;
}
[Benchmark]
[ArgumentsSource(nameof(GetItemNumberOfElements))]
public bool Test1(int count)
{
Console.WriteLine(quot;Proper number of Items should be: {count}, is: {GetNumberOfElements()}");
CheckIfItemNameIsTakenUseCaseDefinition definition = CheckIfItemNameIsTakenUseCaseComposition.Definition(_telemetryClient);
bool result = definition.Function(quot;Item{count}").Result;
return result;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我不确定我是否理解正确,但我相信在您的情况下,您应该使用
Params
而不是Arguments
因为它应用于可以访问的公共字段/属性通过设置方法。与[Arguments]
相比,使用[Params]
的缺点是它适用于给定类中的所有基准测试。此外,如果您正在测试的方法不修改数据库内容,您可以使用
[GlobalSetup]
,该方法将在基准测试开始时仅执行一次。I am not sure if I understood correctly, but I believe that in your case you should be using
Params
instead ofArguments
as it's applied to public field/property which can be accessed by the setup method. The disadvantage of using[Params]
compared to[Arguments]
is that it's applied to all benchmarks in given class.Moreover, if the method that you are testing is not modifying the database contents, you can use a
[GlobalSetup]
which will be performed just once, at the beginning of benchmarking.