Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

Configuration of IJsonAssertionOptions slows down comparison a log

Aberta
#77 4 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
4/5
Tempo estimado
3-5 dias
Facilidade para iniciantes
35/100
Tipo de issue
Bug
Clareza
Razoavelmente clara
Status de atividade
Estagnada
Stack de tecnologia
csharp
Domínio
performance, testing

Direção de pesquisa

Comece em JTokenDifferentiator.CompareValues e rastreie como config.Invoke cria JsonAssertionOptions para cada comparação de valores. Reproduza a lentidão relatada com um documento JSON grande e o callback Using; em seguida, compare o comportamento após alterar o fluxo de opções. O trabalho estará concluído quando a comparação de precisão for preservada, o trabalho repetido do builder for evitado e um desempenho aceitável for demonstrado.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

bug

To check doubles using precision when comparing JSON's, I am using the following options callback in BeEquivalentTo:

options => options.Using<double>(d => d.Subject.Should().BeApproximately(d.Expectation, 0.001))
  .WhenTypeIs<double>()

But it seems that this builder callback is being called for every value comparison.
JTokenDifferentiator.CompareValues contains:

using (var scope = new AssertionScope())
{
    actual.Value.Should().BeEquivalentTo(expected.Value, options =>
        (JsonAssertionOptions<object>)config.Invoke(new JsonAssertionOptions<object>(options)));

    hasMismatches = scope.Discard().Length > 0;
}

With the addition of the Using, a bigger json (MB's) goes from 200ms to +10s on my PC.

As a workaround, I replicated the behavior of the builder by accessing the userEquivalencySteps field on SelfReferenceEquivalencyAssertionOptions using reflection and inserting a custom IEquivalencyStep, instead of using the fluent API.
This brings it to 1s, which is acceptable for my use case.

Would it make sense to not call this options callback for every JSON value and build it once?
Or would adding API to add a custom IEquivalencyStep instead of the builder make sense?

Linguagem predominante
C#
Estrelas
73
Forks
30
Métricas de merge de PRs
Nenhum PR com merge em 30d

Preparar o ambiente

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Issues semelhantes

Mais issues de C#

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.