Configuration of IJsonAssertionOptions slows down comparison a log
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 35/100
- Issue-Typ
- Bug
- Klarheit
- Größtenteils klar
- Aktivitätsstatus
- Veraltet
- Tech-Stack
- csharp
- Bereich
- performance, testing
Rechercherichtung
Beginnen Sie in JTokenDifferentiator.CompareValues und verfolgen Sie, wie config.Invoke für jeden Wertevergleich JsonAssertionOptions erstellt. Reproduzieren Sie die gemeldete Verlangsamung mit einem großen JSON-Dokument und dem Using-Callback und vergleichen Sie anschließend das Verhalten nach einer Änderung des Optionsflusses. Als erledigt gilt die Aufgabe, wenn der Präzisionsvergleich erhalten bleibt, wiederholte Builder-Arbeit vermieden wird und eine akzeptable Performance nachgewiesen wird.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
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?
- Vorherrschende Sprache
- C#
- Sterne
- 73
- Forks
- 30
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Keine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Ähnliche Issues
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 86/100
Devolutions/UniGetUI#5541 ·
Maintainer antworten meist innerhalb von 1 Tag
-
agentic-workflows Needs: Triage :mag:
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
Maintainer antworten meist innerhalb von 1 Tag
-
[誤判定]Offenlinux アプリ: ブラウザー 再現済み 要トリアージ 誤判定
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
yksr-melt/Meltype#853 · 2 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
S: Untriaged
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
Trauma-Station/Trauma-Station#5073 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
Maintainer antworten meist innerhalb von 1 Tag