Laden...

Performance, wenn in einer Schleife ein Char Array mit Substring abgefragt wird

Erstellt von frameworker vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.391 Views
F
frameworker Themenstarter:in
7 Beiträge seit 2019
vor 5 Jahren
Performance, wenn in einer Schleife ein Char Array mit Substring abgefragt wird

Hallo,

wenn ich nur ein char Array habe, bspw. dieses:

char[] charbase = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ' ', '!', '?', '.' };

und dann aber in einer Schleife staendig per Substr darauf zugreifen muss, muesste man ja andauernd wie folgt vorgehen:

while ...
{
    Console.WriteLine(new string(charbase).Substring(0,5));
}

Also mal davon abgesehen, ob das so sinnvoll ist oder nicht. Als C# Anfaenger gehe ich davon aus, dass dann ja jedesmal in der Schleife ein neues String-Objekt erstellt wird.
Was sicherlich nicht sinnvoll ist. Oder ist dieses exempl. Konstrukt nur syntaktisch haesslich und C# optimiert das selbst?

Oder kann man auch das Stringobjekt vorher einmal generieren und dann in der Schleife als Referenz darauf zugreifen?

709 Beiträge seit 2008
vor 5 Jahren

Hallo und willkommen frameworker,

was ist denn dein Ziel?

F
frameworker Themenstarter:in
7 Beiträge seit 2019
vor 5 Jahren

Hallo pinki,

mir ist unklar, inwieweit sich bestimmte Konstrukte auf die Performance auswirken.

Also Beispiel 1 wäre char Array und in der Schleife ständig new string.
Man könnte natürlich sofort einen normalen String bilden a-z und in der Schleife direkt per substr zugreifen.
Aber dann hätten das char Array und der String zwar denselben Inhalt, aber sie wären zwei unterschiedliche Objekte.

Was ich benötige ist so eine Art C Zeiger vom String Objekt auf das char Array. Denn nur dort ist ja die Substr-Methode vorhanden.

5.657 Beiträge seit 2006
vor 5 Jahren

Kann nicht nachvollziehen, was du da versuchst.

Wenn du Performance messen willst, dann kannst du es messen. Dazu gibt es bspw. einen Profiler.

Wenn du Strings in Chars zerlegen willst oder umgekehrt, oder was anderes, dann schau in die Doku. Dort stehen die Methoden, Eigenschaften und Indexer beschrieben, die du dafür benötigst.

[Tipp] Schau in die Doku! - Möglichkeiten der Informationsgewinnung

Weeks of programming can save you hours of planning

709 Beiträge seit 2008
vor 5 Jahren

Wie sich das auf die Performance auswirkt, könntest du mit einem eigenen Benchmark testen.

Suchst du vielleicht etwas wie Span<T>?

16.807 Beiträge seit 2008
vor 5 Jahren

bspw. dieses:

Wenn Du von "beispielsweise" redest, können wir halt auch nur "beispielsweise" antworten.

Ein fixer Wert, wie es Char darstellt, kann durchaus performanter sein als eine Referenz, wie es ein String darstellt - und umgekehrt.

Was ich benötige ist so eine Art C Zeiger vom String Objekt auf das char Array.

Warum "benötigst" Du das? Was erhoffst Du Dir? Was ist die Anforderung?
Für mich riecht das zunächst nach premature optimization

4.931 Beiträge seit 2008
vor 5 Jahren

Wenn du das (konstante) Objekt einmalig vor der Schleife erstellst, wäre das von der Performance her besser:


string str = new string(charbase).Substring(0,5);
while (...)
{
    Console.WriteLine(str);
}

Nur wenn die Parameter variabel sind, dann müßtest du den Substring jedesmal innerhalb der Schleife erzeugen (oder aber alle möglichen Strings vorher in einem String-Array erzeugen und speichern).

T
2.219 Beiträge seit 2008
vor 5 Jahren

In deinem aktuellen Beispiel werden gleich zwei Strings erstellt.
Einmal durch den Konstruktor mit new sowie durch dein Substring.
Je nachdem was du dort machst und wie häufig du es machst, verheißt du nur sinnlos Zeit und RAM.

Keine Ahnung was das Ziel sein soll, aber sinnvoll ist es nicht.
Auch was die Zeiger in C# angeht, kannst du dich zu 99% davon verabschieden.
Den Fall wo du mit Zeigern arbeitest ist im Unmanged Code, was aber nur in bestimmten Fällen sinnvoll ist.
Zu 99% der Zeit macht C# schon alles soweit richtig.
Eine sinnvolle Optimierung deines Codes sehe ich hier nicht, da dein Snippet kein Szeanatio zeigt wo man was optimieren kann.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

C
2.121 Beiträge seit 2010
vor 5 Jahren

Da scheint tatsächlich noch verschiedenes unklar zu sein. Trotzdem möchte ich auf die eigentliche Frage eingehen. Dass der String natürlich auch außerhalb der Schleife erzeugt werden kann weißt du sicher.

Man könnte natürlich sofort einen normalen String bilden a-z und in der Schleife direkt per substr zugreifen.
Aber dann hätten das char Array und der String zwar denselben Inhalt, aber sie wären zwei unterschiedliche Objekte.

Der String ist ein anderes Objekt als das Array. Das ist doch unabhängig davon wo du ihn generierst.

Du könntest auch gleich einen String erzeugen der aus den gewünschten Zeichen besteht, ohne den Umweg über das Array. Da du das so zeigst, scheint etwas mehr dahinter zu stecken als wir wissen. Wenn du dein tatsächliches Problem lösen willst solltest du mehr darüber erzählen.