myCSharp.de - DIE C# und .NET Community (https://www.mycsharp.de/wbb2/index.php)
- Entwicklung (https://www.mycsharp.de/wbb2/board.php?boardid=3)
-- Grundlagen von C# (https://www.mycsharp.de/wbb2/board.php?boardid=88)
--- Performance, wenn in einer Schleife ein Char Array mit Substring abgefragt wird (https://www.mycsharp.de/wbb2/thread.php?threadid=121529)


Geschrieben von frameworker am 29.01.2019 um 15:14:
  Performance, wenn in einer Schleife ein Char Array mit Substring abgefragt wird
Hallo,

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

C#-Code:
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:

C#-Code:
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?


Geschrieben von pinki am 29.01.2019 um 15:24:
 
Hallo und willkommen frameworker,

was ist denn dein Ziel?


Geschrieben von frameworker am 29.01.2019 um 15:49:
 
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.


Geschrieben von MrSparkle am 29.01.2019 um 16:29:
 
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


Geschrieben von pinki am 29.01.2019 um 17:23:
 
Wie sich das auf die Performance auswirkt, könntest du mit einem eigenen Benchmark testen.

Suchst du vielleicht etwas wie  Span<T>?


Geschrieben von Abt am 29.01.2019 um 19:01:
 
Zitat von frameworker:
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.

Zitat von frameworker:
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


Geschrieben von Th69 am 29.01.2019 um 19:11:
 
Wenn du das (konstante) Objekt einmalig vor der Schleife erstellst, wäre das von der Performance her besser:

C#-Code:
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).


Geschrieben von T-Virus am 29.01.2019 um 19:15:
 
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


Geschrieben von chilic am 30.01.2019 um 06:03:
 
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.

Zitat:
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.


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 21.01.2020 06:07