Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von gfoidl
Thema: Timeslot bestimmen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Th69,

mir ist / war ziemlich klar dass du diesen "Trick" kennst, daher hab ich auch nicht dich angesprochen, sondern alle anderen die das nicht kannten.
Das erspart nämlich das Runden via Um- und Zurückwandeln zu double od. einen if-Block. Der Trick ist eher als ganz allgemeiner Tipp gemeint.

mfG Gü

Thema: Timeslot bestimmen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

Zitat
// evtl. noch aufrunden
Dazu gibt es bei der Ganzzahldivision einen netten Trick:


return (60 * time.Hour + time.Minute + (slotMinutes - 1)) / slotMinutes;
Spart die Konvertierung zu double und zurück, die bei Math.Round nötig wäre.


mfG Gü

Thema: Mails versenden - ohne Outlook
Am im Forum: Office-Technologien

Hallo fichz,

Zitat von T-Virus
Kleiner Hinweis, den SmtpClient soll man nicht mehr benutzen.
Es steht zwar auch in dem von T-Virus verlinkten Docs-Beitrag zum SmptClient, aber damit es explizit erwähnt wird: MailKit sollte für neue Entwicklungen verwendet werden.

Schau dir in der dortigen Dokumentation auch die Beispiele an und du wirst sehen dass
Zitat von fichz
Wenn nicht, dann wird es mir eh nicht ausbleiben es selbst zu basteln
gar nicht so schwer ist ;-)

mfG Gü

Thema: MQTT Verbindungsprobleme
Am im Forum: Netzwerktechnologien

Hallo Raumsonde,

mit den gegebenen Infos ist es schwer bis unmöglich eine konkrete Hilfe zu bieten.
Aber https://www.nuget.org/packages/MQTTnet ist gängiger und damit gibt es i.d.R. keine Probleme. Versuch diese Paket einmal.

mfG Gü

Thema: Datensätze alle 2ms speichern
Am im Forum: Datentechnologien

Hallo RobotSox ,

Zitat
eine ... Datenbank schreiben oder eher am Filesystem (.csv) Datei bleiben?
...
Dies soll gesichert werden um eine Kurve der Antriebsdaten zu bekommen.
D.h. schreibend und lesend können zeitgleich stattfinden? Falls ja, so würde ich stark zu einer Datenbank tendieren welche für solche Zwecke ausgelegt sind und problemlos damit umgehen können.
(CSV-) Dateien sind im Grunde nicht gleichzeitiges Lesen und Schreiben ausgelegt und die Gefahrt ist groß, dass die Datei "zerschossen" wird. Rechne einfach mal aus wieviele Werte so in einer Stunde gesammelt werden und überleg dann ob CSV sinnvoll sein kann od. nicht.

Um jedoch das wirklich beurteilen zu können siehe Abts Antwort(en) und bedenke auch:
  • Soll der Datenspeicher auf einem Server laufen als der "Lese-Dienst"?
  • Was soll mit diesen Daten sonst noch passieren? Dabei auch versuchen etwas in die Zukunft zu denken.
  • Ist es nur eine Maschine od. sollen das für mehrere Maschinen durchgeführt werden? Um z.B. Korrelationen zu finden, etc.
  • Sollen die Daten (langzeit) archiviert werden?
  • Welche Datenmenge fallen an über einen Tag, Monat, Jahr -- das lässt sich ja recht gut abschätzen / errechnen?
  • Können Cloud-Lösungen verwendet werden?

Es gibt auch jede Menge Datenbank-Systeme und auch spezielle Time-Series Datenbanken. Auch hier lässt sich nicht pauschal beurteilen was am besten geignet ist.

Wenn du das evaluierst so werden sich ein paar Fragen von dir von selbst erklären ;-)
Zitat
gesichert werden um eine Kurve der Antriebsdaten zu bekommen
Wenn ein Diagramm der Antriebsdaten das Ziel sein soll, so werden dort sicherlich nicht die Datenpunkte aller 2ms Intervalle dargestellt werden können. Das überlastet die UI (außer es soll ein Oszilloskop werden). Spätestens beim Visualisieren müssen die Daten aggregiert werden um sinnvoll damit arbeiten zu können. Daher kann es auch sinnvoll sein, die Daten nach dem Lesen und im Zuge des "Sicherns" bereits zu Filtern und Aggregieren um die Datenmenge zu reduzieren.

mfG Gü

Thema: FileStream Verhalten bei "Read only"
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Krumnix,

Streams können auch kopiert werden -- siehe CopyTo / CopyToAsync.

Bei async-Vorgängen mit Dateien ist auf das korrekte Erstellen des FileStreams mit der async-Angabe wichtig (bei Windows). Ob hier sync od. async besser ist kann ich nicht pauschal beurteilen, es sollte gemessen werden. Ev. lässt sich auch eine passendere Buffergröße verwenden, da die .NET Implementierung per Default eine gute Wahl darstellt, aber keine beste Wahl für "deine Hardware" sein muss.

mfG Gü

Thema: Projekt-Verschlüsselungssoftware
Am im Forum: Smalltalk

Hallo,

native Übersetzung für .NET läuft unter "AOT" (ahead of time compilation) und wird mittels crossgen2 durchgeführt.
Weitere Infos können z.B. in Conversation about crossgen2 nachgelesen werden.

Aktuell passiert da recht viel im "runtimelab"-Repo auf GitHub, da es für einen wirklichen produktiven Einsatz mit voller Unterstützung seitens .NET doch ein paar Sonderfälle (v.a. alles reflektion-basierte) gibt die noch gelöst werden müssen.

mfG Gü

Thema: Implizit privates Feld bei Auto-Property?
Am im Forum: Grundlagen von C#

Hallo sven007,

Zitat
In beiden fällen kann ich doch von außen lesend und schreibend auf Name zugreifen.
Noch als Ergänzung zu den anderen Antworten dazu.
Stell dir vor du erstellst eine Library und diese hat eine öffentliche API. Diese Library sollte nach Semantic Versioning 2.0.0 versioniert werden.
Jetzt hast du nur ein Feld


public class Person
{
    public string Name;
}
und kommst später drauf, dass doch eine Validierung nötig wäre beim Setzen des Wertes (für das Feld). Das geht dann nicht elegant, daher wird jetzt aus dem Feld eine Eigenschaft gemacht um dort validieren zu können:


public class Person
{
    private string _name;
    public string Name
    {
        get => _name;
        set
        {
            if (value is null)
            {
                throw new ArgumentNullException("....");
            }

            _name = value;
        }
    }
}

Aber: das Ändern von Feld zu Eigenschaft ist eine "breaking change", da sie das öffentliche API verändert! Gem. SemVer müsste somit eine neue Hauptversion erstellt werden.

Werden also gleich Properties / Eigenschaften verwendet, so gewinnt man Flexibilität und kann später einfacher die Implementierung der Eigenschaft ändern.
Felder hingegen sollte so gut wie immer private sein (Datenkapselung).
Zitat
ob es dadurch auch implizit ein privates Feld (bspw. _Name) gibt, welches ich in der Klasse verwenden kann. Dem ist nicht so, oder?
Der C# Compiler erzeugt folgenden Code. Dort ist das <Name>k__BackingField zu sehen, aber das ist vom "Benutzercode" nicht direkt zugreifbar (und via Reflection sollte auch nicht darauf zugegriffen werden, da der Name des Feldes sich mit jeder C# Compiler-Version ändern kann / darf und somit dieser Code sehr fragil wäre).

Wie FZelle erwähnte kommt mit C# 10 das field Schlüsselwort, damit sollte


public class Person
{
    public string Name { get; set => field = value ?? throw new ArgumentNullException(); }
}
möglich werden.

mfG Gü

Thema: Implizit privates Feld bei Auto-Property?
Am im Forum: Grundlagen von C#

Hallo sven007,

die Auto-Properties sind eine Erleichterung seitens C#, welche das Tippen vom klassichen Muster für Eigenschaften vereinfacht.

Aus


public class Person
{
    private string _name;    // das ist ein Feld -- lt. Namenskonvention klein geschrieben und oft mit einem _ vorangestellt

    // Eigenschaft klassisch geschrieben
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    // Eigenschaft mit expression bodyed members geschrieben, ist im kompilierten Code gleich der oberen Eigenschaft (außer der Name der Eigenschaft ist anders)
    public string Name1
    {
        get => _name;
        set => _name = value;
    }
}
Da dies mühsam zum Tippen werden kann, wurden mit C# 3.0 die "Auto-Properties" eingeführt:


public class Person
{
    public string Name { get; set; }
}
Dabei erzeugt der C# Compiler das "Backing-Field" automatisch. Dieser Vorteil der weniger Tipp-Arbeit hat aber den Nachteil, dass keine Validierungen, etc. im Setter der Eigenschaft durchgeführt werden können. D.h. willst du im Kreisbeispiel den Radius prüfen, so verzichte auf Auto-Properties und schreib sie manuell wie du es gemacht hast.

Nebenbemerkung: da solche Klassen wie oben gezeigt recht häufig sind und als POCO bezeichnet werden, wurde mit die C# 9 die Möglichkeit von Records geschaffen, mit denen sich das noch einfacher schreiben lässt:


public record Person(string Name);



mfG Gü

Thema: Schnelle Datenübergabe an Steuerelement
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo BJA-CH ,

Zitat
mit eintreffen eines Messpunktes das Chart auch wirklich aktualisieren muss
Macht eher wenig Sinn. Der Weg via Frame-Rate, etc. ist da schon sinnvoller.
Mach einen Ringbuffer für die Werte und ein Timer nimmt sich dann einen Snapshot dieses Buffers und stellt diese Daten dar. Zeitgleich bzw. unabhängig davon kann der Ringbuffer weiter befüllt werden.
Achte dabei aber auf passende Synchronisierung bzw. eine nimm eine Collection (aus System.Collections.Concurrent).

mfG Gü

Thema: Schnelle Datenübergabe an Steuerelement
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo BJA-CH ,

Zitat
analoge Daten vom Mikroprozessorsystem "Arduino" einlesen
Von welcher Datenmenge (i.e. Datenpunkte pro Sekunde) reden wir?
Sollen die Daten nur angezeigt werden od. dann auch irgendwo archiviert werden?
Willst du alle Daten anzeigen od. nur das aktuellste Fenster mit z.B. der letzten Sekunde und ältere Daten verschwinden aus der Anzeige? Also eine Art Ringpuffer welcher die Daten hält und diese zur Anzeige verwendet werden.

Je nachdem wie die Antworten zu diesen Fragen ausschauen, gibt es praktikablere Wege für eine solche Darstellung.
Lesen der Daten sollte auf jeden Fall in einem eigenen Thread durchgeführt werden, so dass der UI-Thread (= Haupt-Thread) für die Visualisierung genügend Zeit hat.
Zitat
kopiere das Messergebnis in eine kleine Klasse und füge eine fortlaufende Nummer zur Kontrolle dazu
Bzgl. "Klasse", das ist eine Allokation die der GC später abräumen muss. Daher kann es -- je nach Datenmenge -- sinnvoller sein dazu eine struct zu verwenden. Z.B.


public readonly struct Reading
{
    private static int s_id;

    public int Id       { get; }
    public double Value { get; }

    public Reading(double value)
    {
        // Wenn du sicher sein kannst, dass das Lesen sequentiell passiert reicht das.
        this.Id = s_id++;

        // Sonst muss auch das hier atomar passieren.
        //this.Id = Interlocked.Increment(ref s_id);

        this.Value = value;
    }
}
Zitat
füge den Messwert in eine ObservableCollection<double>-Liste
Bedenke hier auch dass diese Collection sehr groß werden kann und das für das Datenbindung noch mehr (zeitlicher) Aufwand wird, da O(n).
Fürs Binding sollte nur der jeweilige Datenbereich vorhanden sein, der auch tatsächlich benötigt wird und keine historischen Daten -- siehe oben bei Frage zu Ringpuffer.

Datenbindung in WPF ist schön und praktisch, aber hat auch "Overhead" der je nach Datenmenge die Bremse werden kann.
Oszis werden oft direkt per OpenGL grafikkartennah umgesetzt, da es so kaum Overhead gibt. Od. mit minimalen "Wrapper-Libraries" wie z.B. VTK. Ich denke beides lässt sich wiederum in die WPF-Anwendung einbinden (via Handles, aber da kenn ich mich zu wenig aus).

mfG Gü

Thema: Performance-Verbesserungen in .NET 6
Am im Forum: Szenenews

Hallo T-Virus,

:-)

Es freut mich meinen Nickname da zu lesen (aber auch schon in ein paar der vorherigen Blog-Posts dieser Serie) und es ist mir auch eine Ehre dort erwähnt zu werden, denn es ist wohl der größte Dank und Wertschätzung der Beiträge zum .NET-Code. V.a. wenns Stephen Toub schreibt, da ich ihn als eher kritisch und sehr akkurat (als positive Eigenschaften) einschätze (persönlich kenn ich ihn nicht).

Dass .NET open source entwickelt und auch gelebt wird, gefällt mir sehr gut und ich finde die .NET Foundation und Microsoft machen dies hervorragend.
Durch das Verfolgen von Pull Requests lässt sich da schon eine Menge lernen, denn es gibt gewisse "Dinge" in .NET die man als "normaler" .NET Entwickler (~ Benutzer von .NET) einfach nicht auf dem Schirm haben kann, auch da sie nirgends dokumentiert sind und nur im Code erlesbar sind, aber wer liest sich schon durch zig-tausend Zeilen GC-Code?
Natürlich kommt es auch da auf die Zielsetzung darauf an. Bestimmte Punkte die in PRs (und Issues) besprochen werden sind für 99,99 % der C#-Programmierer irrelevant. Wer sich aber in den Niederungen von .NET weiterbilden will, so sind dort genau die richtigen Leute (meist die jeweiligen Entwickler / Architekten) am Werk. Genauso ist es mit eigenen PRs und deren Review. Sollte es Punkte geben, bei denen man "ansteht", so wird einem der Weg bereitet und Hilfestellungen zum Erlernen der nötigen Schritte gegeben, so dass man weiter kommt -- und all dies in einer freundlichen netten Umgangsform, im Gegensatz zu manch anderen open source-Communities. Besonders gefällt mir bei PR-Reviews (allgemein), dass es so gut wie nie heißt "mach es so", sondern "mach es so, weil [Begründung]" und somit auch der Lerneffekt mit an Bord ist.
Ein weiterer netter Punkt ist, dass mit neuen Typen und / oder Sprachfeatures von C# vorzeitig "probiert" werden kann und dabei von den "Machern" selbst das Review dazu kommt. Diese Möglichkeit gibt es sonst nicht sehr oft. Als beispielsweise Span mit .NET Core 2.1 eingeführt wurde, gab es nicht sehr viel Info darüber, mehr od. weniger von offizieller Seite nur einen Blog-Post in dem die Verwendung und Vor-/Nachteile grob erklärt wurden. Die Feinheiten konnten in diesem Blog aber nicht erwähnt werden, da es eben nciht die Zielsetzung dieses Beitrags war. Hat man sich jedoch an PRs rund um Span beteiligt, so gab es Feedback (auch ein Approve ist Feedback) von den JIT-Architekten, etc. also genau von den Leuten welche Span selbst implementiert hatten. Ein besseres "battle testing" kann ich mir diesbezüglich gar nicht vorstellen.
Edit: Od. wie jetzt aktuell für .NET 6 mit den NativeMemory-Methoden für Alloc, AlignedAlloc, ReAlloc, etc. Wann verwende ich Alloc und wann AlignedAlloc bzw. wie schaut das standardmäßige Alignment bei Alloc aus? Generell wann ist es sinnvoll auf diese Methoden zurückzugreifen bzw. was sind potentielle Anwendungsgebiete dafür, ist es eine bessere Alternative zu Marshal.AllocHGlobal? Diese und ähnliche Fragen (sowie deren Antworten) tauchen bei PR Reviews auf, da Teile vom Team das im Moment auch noch nicht wissen und so ist man "live dabei" um eben mit-zulernen. Ob man diese APIs jemals brauchen wird ist eine andere Frage, aber ich finde es immer interessant zumindest einen Überblick über meine "Werkzeugkiste" zu haben, denn es mag ja sein dass ich es irgendwann brauchen kann (wobei für diese APIs habe ich schon konkrete Anwendungsfälle).

Die Reise von und mit .NET geht weiter, neue Typen und APIs kommen hinzu und deren Verwendung will erlernt / erprobt werden. Warum also das nicht per PR für .NET selbst probieren od. schon bei der Diskussion in den Issues seinen Senf dazu geben? .NET ist open source und wer will kann sich an der Weiterentwicklung beteiligen. Da die Community freundlich ist, gibt es auch keinen Grund sich nicht zu trauen (allerdings sollte man schon wohl überlegt agieren ;-)).
Alleine das Erstellen von Issues zu Wünschen, Performance-Einbußen*, etc. ist hilfreich. Die hauptsächlichen Entwickler von .NET "leben in ihrem eigenen Universum" und wissen womöglich gar nicht welche Anwendungen wir so erstellen und worauf es dabei ankommt. Daher kann durch Beteiligung an Diskussionen ihr Blick und Verständnis erweitert werden und sie können so ihre Priorisierung von Features, etc. adaptieren. Dabei reicht auch oft schon ein "Like" zu einer bestehenden Issue um dieser mehr Gewicht zu geben.

* Wie in diesem Thread schon erwähnt wurde, wird die Performance von .NET automatisch überwacht, daher werden viele Regressionen auch automatisch gemeldet. Aber: es können nur jene Szenarien überwacht werden, für die auch entsprechender Benchmark-Code erstellt wurde. D.h. es nicht jedes mögliche Szenario und Konstallation abgedeckt, da dies einfach nicht umsetzbar ist. Daher gibt es die Möglichkeit, wenn auch nicht mit sehr hoher Wahrscheinlichkeit, dass ein bestimmtes Szenario aus einer Anwendung eine Regression erfährt und wenn diese per Issue gemeldet wird, so kann dies untersucht werden und ggf. der Benchmark entsprechend angepasst / erweitert werden, damit diesen Sicherheitsnetz für Performance engmaschiger wird.

Jetzt bin ich ein wenig abgeschweift...

mfG Gü

Thema: Alle möglichen IP Adressen anhand eines Netzwerks rausfinden
Am im Forum: Netzwerktechnologien

Hallo 1nf1n1ty,

abgesehen von Abts (aufwändiger) Recherche ist das Problem an sich ja nicht recht kompliziert. Siehe Netzmaske -- es ist im Grunde nur eine Bit-Maskierung (cf. [Artikel] Bitoperationen in C#) und daraus lassen sich auch wieder IPv4-Adressen erzeugen, damit diese ausgegeben, etc. werden können. Das wäre eine nette Übung zum selber programmieren (und somit auch etwas zu lernen / probieren).

mfG Gü

Thema: Performance-Verbesserungen in .NET 6
Am im Forum: Szenenews

Hallo,

Zitat
Abhängigkeiten (zB ans Betriebssystem) ändern musste
Es gibt noch ein paar (wenige) andere, bei denen latente Bugs behoben wurden auf Kosten von etwas Performance, aber Korrektheit ist wichtiger.
Bei diesen Issues ist aber das Potential hoch, dass durch weitere Optimierungen z.B. im JIT dieser Performance-Verlust wieder ausgeglichen werden kann.

Aktuell -- also bevor .NET 6 fertig ist -- gibt es noch ein paar "Tuning-Bugs" v.a. bei den Themen "loop alignment" und "profile guided optimization". Bei letzterem teils da alte Profil-Daten verwendet wurden.

Aber mit https://github.com/dotnet/performance gibt es für .NET ein eignes Repo für die Benchmarks und diese werden automatisch und regelmäßig ausgeführt. Sollten dabei Regressionen festgestellt werden, so gibt das auch (mehr od. weniger automatisch) ein Issue im runtime-Repo so dass dies anschließend genauer untersucht werden kann.
In den letzten Jahren hat sich bei .NET eine richtige Performance-Infrastruktur inkl. Team entwickelt (finde ich gut so).

mfG Gü

Thema: Sammelthema Wünsche und Bugreports myCSharp
Am im Forum: Wünsche und Kritik

Hallo,

Zitat
selber entscheiden ob ein neues Tab aufgeht oder nicht.

Daher verstehe ich die ganze Diskussion darüber auch nicht, da die Lösung a) so einfach ist, b) jeder Benutzer nach seinen Vorlieben entscheiden kann.

Die Umsetzung in der Foren-SW ist recht trivial, aber wenn es wiederum einstellbar in den Benutzeroptionen sein soll (siehe andere Beiträge hier dazu und v.a. in Hinsicht auf nicht angemeldete Benutzer / Gäste) so rechtfertigt der Aufwand den Nutzen nicht, v.a. da es eine nocht trivialere Möglichkeit mit mittlere Maustaste / Strg + Klick / AddOns / etc. gibt.

mfG Gü

Thema: Wie Login-Mail deaktivieren?
Am im Forum: Wünsche und Kritik

Hallo ruedigerhund,

genau wegen der von T-Virus gegebenen Begründung ist das so.

mfG Gü

Thema: In Applikation alternativ 32-bit oder 64-bit DLL verwenden
Am im Forum: Rund um die Programmierung

Hallo oehrle,

Zitat
das ich dazu eine DLL bekommen habe, die mit 32-Bit Architektur erstellt ist
Eine .NET DLL od. eine native DLL?
Zitat
Nun habe ich den Eindruck, dass die Appliaktion nun öfters abschmiert, ... viel Arbeitsspeicher
Hast du dazu eine Fehlermeldung od. einen Eintrag in der Windows-Ereignisanzeige?
32bit Anwendungen / Prozesse können auf weniger Arbeitsspeicher (korrekter: virtuellen Speicher) zugreifen als 64bit Prozesse, aber ich glaube eher nicht dass dies das Problem ist. Falls doch solltest du OutOfMemoryExceptions sehen -- die aber nicht zwangsläufig mit zu wenig Speicher zu tun haben müssen (sondern ein paar andere Gründe haben können wie hauptsächlich dass der GC keinen Platz findet um das Objekt der gewünschten Größe zu alloziieren).

mfG Gü

Thema: Visualle Unterschiede in einem Bild erkennen
Am im Forum: Grafik und Sound

Hallo Christoph K. ,

schau mal bei Google Suche nach "image similarity"
Auf diesem Gebiet hat sich in letzter Zeit ziemlich viel getan (ganz am aktuellen Stand bin ich selbst nicht, daher nur der Suchlink).
Für gute und brauchbare Ergebnisse würde ich ein bewährtes Framework verwenden, anstatt das selbst zu programmieren (z.B. per Farbhistogramm-Ähnlichkeit).

mfG Gü

Thema: Vereinfachung If Ausdruck
Am im Forum: Rund um die Programmierung

Hallo Nejox,

Zitat
Gibt es hier eine Schreibweise die mir das ganze etwas abkürzen kann?
Nein.
In C# muss das explizit für jeden "Test" angegeben werden. Für Möglichkeiten siehe T-Virus' Antwort.

Weil es irgendwie zum Thema passt:


static bool IsZero(int a, int b) => a == 0 || b == 0;
kann, da es Ganzzahlen sind, vereinfacht werden zu


static bool IsZero(int a, int b) => (a | b) == 0;
Das spart eine Verzweigung im Code und ist daher auch performanter. Leserlicher ist vermutlich nicht für alle, da Bit-Operationen vorkommen, daher gibt es in .NET 6 (Herbst 2021) eine Optimierung im JIT, welche aus dem ersten Code den zweiten macht.

Aber für Referenzen, wie in deiner Frage, geht das nicht.

mfG Gü

Thema: String auf mehrere Zeilen prüfen
Am im Forum: GUI: Windows-Forms

Hallo,

Zitat
aber nur beim alten Classic Mac OS, seit Mac OS X wird (wie bei Unix) '\n' benutzt
Würde jetzt Windows auch nur noch auf \n setzen, so wäre etlicher Code einfacher und performanter (beides zugleich: Juhuu) zu schreiben.
Ist vermutlich mehr ein Wunsch als (nahe) Realität.

mfG Gü

Thema: String auf mehrere Zeilen prüfen
Am im Forum: GUI: Windows-Forms

Hallo T-Virus ,

Zitat
Bei .NET 5 ist es nun auf "\n" umgestellt, da klappen beide Fälle.
source.dot.net sucht in der Unix-basierten Runtime, daher ist deine Aussage nicht ganz vollständig.

Environment.UnixOrBrowser.cs <-> Environment.Windows.cs.

mfG Gü

Thema: RestAPI oder vergleichbares
Am im Forum: Datentechnologien

Hallo Sascha87,

Zitat
Post bitte löschen.
Posts bzw. Threads werden i.d.R. nicht gelöscht, da sie ja auch für die Community interessant sein können und "gemeinsam mehr erreichen" gilt.
Wenn der Thread aber "erledigt" ist, so kannst du den Titel (via Startbeitrag editieren) mit einem [erledigt] voranstellen, damit diese deutlicher sichtbar ist.

mfG Gü

Thema: Parsen von HTTP User Agents mit .NET
Am im Forum: Projekte

Hallo zusammen,

Zitat
im Rahmen der Analyse der Leistung des Forums aufgefallen ist, dass unser bisheriger Parser (UA Parser)
Dazu als Ergänzung / Erklärung.

UA Parser kann ziemlich viele User Agents parsen, aber (leider) ist die .NET Bibliothek ein ziemlich direkter Port des JavaScript Projekts. Das macht sich v.a. durch die unzähligen Closures bemerkbar und sind in einem GC-Dump deutlich sichtbar -- siehe Anhang.

Für eine Web-Anwendung hätte ich mir Objekte von Kestrel (Server), MVC, EF Core, etc. erwartet und nicht dass eine "Hilf-Bibliothek" dort so dominant zu sehen ist.
BTW: unser eigener Code, abgesehen vom DbContext, taucht erst relativ weit unten auf und ist in diesem Abschnitt nicht zu sehen.

Thema: Frage zu Interpolation
Am im Forum: Rund um die Programmierung

Hallo STF-DIR ,

hilft dir bilineare Interpolation weiter?
(ist die einfache lineare Interpolation angewandt auf 2D)

mfG Gü

Thema: Filter Liste mit Linq
Am im Forum: Rund um die Programmierung

Hallo zusammen,

Ergänzung für die Micro-Optimierungen:

Laufzeit ist eine Sache, aber je nach Kontext können auch die Allokationen eine Rolle spielen.
Hier im Thema vom OP geht es um eine Desktopanwendung, da wird wohl eher die Laufzeit eine Rolle spielen, da die GC-Arbeit sich nicht so bemerkbar machen wird.
Bei Server-Anwendungen hat der GC mMn mehr Gewichtung in der Entscheidung Laufzeit <-> Allokationen, da dort u.U. viel CPU-Zeit für das Aufräumen vom Speicher benötigt werden kann. Und der beste Weg dem GC weniger Arbeit zu machen ist einfach weniger zu Allozieren.

Wenn es eine Entscheidung / Tradeoff zwischen Laufzeit und Allokationen zu machen gilt, so sollte diese basierend auf Metriken wie Requests pro Sekunde, Antwortzeiten / Latenz, etc. getroffen werden. Also das größere Bild über eine längeren Zeitraum betrachtet werden und nicht nur ein Micro-Benchmark*. Letztere finden isoliert statt und v.a. wenn es Allokationen gibt, so wird das Zusammenspiel mit anderen Allokationen der Anwendung nicht real abgebildet. Daher können auch keine Pauschal-Aussagen getroffen werden, was eindeutig zu bevorzugen ist.

* Micro-Benchmarks sind ein Mittel um Varianten zu beurteilen, haben auch gewissen Einschränkungen die nicht außer Acht gelassen werden sollten. Neben den angesprochen Allokationen sind auch ein paar CPU-Effekte (Branch-Prediktor, Caches, ...) zu berücksichtigen und daher spiegeln sie oft nicht die Realität wider.

Wenn ich den obigen Benchmark ein wenig ergänze


using System.Collections.Generic;
using System.Linq;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Running;

BenchmarkRunner.Run<LinqTest>();

[MemoryDiagnoser]
[CategoriesColumn]
[GroupBenchmarksBy(BenchmarkLogicalGroupRule.ByCategory)]
public class LinqTest
{
    private List<string> _list;

    [GlobalSetup]
    public void Setup()
    {
        _list = Enumerable.Range(0, 100).Select(c => c.ToString()).ToList();
    }

    [Benchmark(Baseline = true, Description = "Count only")]
    [BenchmarkCategory("Count")]
    public int Count() => _list.Count(e => e.Contains("a"));

    [Benchmark(Description = "Where Count")]
    [BenchmarkCategory("Count")]
    public int WhereCount() => _list.Where(e => e.Contains("a")).Count();

    [Benchmark(Baseline = true, Description = "First only")]
    [BenchmarkCategory("First")]
    public string First() => _list.FirstOrDefault(e => e.Contains("a"));

    [Benchmark(Description = "Where First")]
    [BenchmarkCategory("First")]
    public string WhereFirst() => _list.Where(e => e.Contains("a")).FirstOrDefault();
}

so kommt bei mir dabei
|        Method | Categories |     Mean |     Error |    StdDev | Ratio | RatioSD |  Gen 0 | Gen 1 | Gen 2 | Allocated |
|-------------- |----------- |---------:|----------:|----------:|------:|--------:|-------:|------:|------:|----------:|
|  "Count only" |      Count | 2.184 μs | 0.0433 μs | 0.0405 μs |  1.00 |    0.00 | 0.0114 |     - |     - |      40 B |
| "Where Count" |      Count | 1.293 μs | 0.0249 μs | 0.0341 μs |  0.59 |    0.02 | 0.0229 |     - |     - |      72 B |
|               |            |          |           |           |       |         |        |       |       |           |
|  "First only" |      First | 2.350 μs | 0.0427 μs | 0.0399 μs |  1.00 |    0.00 | 0.0114 |     - |     - |      40 B |
| "Where First" |      First | 1.861 μs | 0.0364 μs | 0.0357 μs |  0.79 |    0.02 | 0.0229 |     - |     - |      72 B |

heraus.
Anmerkung: die absoluten Laufzeit-Werte sind uninterssant, es geht nur um das Verhältnis zwischen den Varianten.

Die Varianten Where + Count / First sind also gut 20-40% schneller, allozieren aber um 80% mehr (da zwei Linq-Enumeratoren benötigt werden).
Hier haben wir also das vorhin erwähnte Tradeoff-Problem zwischen Laufzeit und Allokationen.

Was würde ich nun tun?
Desktopanwendung: das Where-Count wie von Abt empfohlen verwenden. Das ist leserllich -- mindestens genauso gut wie nur Count -- und schneller. Dass ein wenig mehr alloziert wird stört nicht.
Serveranwendung: mit Where-Count starten. Sollte es in einem Profil (entweder CPU od. GC) als großer Einfluss auftauchen, so vermutlich auf Linq verzichten und selbst über die Auflistung iterieren, v.a. wenn ich weiß dass es eine List ist kann das performanter und ohne Allokation durchgeführt werden. Wenns aber nicht in einem Profil auftaucht, so erspare ich mir die Arbeit und gehe dein einfachen Weg.


mfG Gü

Thema: async Task<bool>
Am im Forum: Grundlagen von C#

Hallo TheGateway,

warum überhaupt async wenn im Code nur synchrone Teile vorkommen? Od. ist das Beispiel zu sehr gekürzt?

Zitat
bekommt man die forearch auch irgendwie async ?
Mit C# 8 async Streams ist es möglich.
Macht aber nur Sinn wenn es tatsächlich asynchrone Vorgänge sind (z.B. Datenbank, HTTP-Requests, etc.)

Noch etwas: [Tipp] Anfängerhinweis == true / == false


mfG Gü

Thema: "Duplikate" mit Revisionsnummer auflisten
Am im Forum: Datentechnologien

Hallo dscNRW,

was soll denn passieren wenn mehr als eine Revision vorhanden ist?

Als Denkanstoß allgemein: group by und / oder max bzw. min.

mfG Gü

Thema: Eigenen Auth-Handshake über TCP entwickeln
Am im Forum: Netzwerktechnologien

Hallo Loofsy,

wenn Abts Vorschläge nicht angewandt werden können*, so kann der ASP.NET Core WebServer Kestrel dazu verwendet werden. Als Beispiel siehe MultiProtocolAspNetCore. D.h. Kestrel, als verifizierter WebServer, übernimmt die ganze Arbeit für dich und du brauchst nur via ConnectionHandler die Logik hinzufügen.

* sollte das ein Vorgesetzter so vorschreiben, so hat dieser keine Ahnung und betreibt Geld- / Ressourcenvernichtung

mfG Gü

Thema: Asynchron in mehreren Threads Daten Generieren führt hin und wieder zur NullReferenceException?
Am im Forum: Rund um die Programmierung

Hallo Sebastian1989101,

ehrlich gesagt hab ich noch nicht ganz verstandes was erreicht werden soll, aber so wie ich es verstanden habe wäre Parallel Linq / PLinq eine Option dafür.
Duplikate können mit GroupBy "gefiltert" werden, etc.

mfG Gü

Thema: Roslyn: CSharpCompilation.Emit missachtet Referenzen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Fabiano,

die Solution kompiliert bei mir wenn ich in Fipscode.CodeGenerator.csproj diie Referenzen hinzufüge:


<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="System.CodeDom" Version="5.0.0" />
        <PackageReference Include="System.Reflection.Emit" Version="4.7.0" />
    </ItemGroup>

</Project>

BTW: ich dachte es ist ein Roslyn Source Generator. Sind dir diese bekannt? Damit kann zur Entwurfszeit Code erstellt werden und verweidet dies zur Laufzeit -- sofern möglich.

mfG Gü