WinFuture-Forum.de: [CLOSE PLS] C# Zeitdauer bei Array-Operationen - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

[CLOSE PLS] C# Zeitdauer bei Array-Operationen Werte aus Byte-Array in String-Array kopieren


#1 _nobido_

  • Gruppe: Gäste

geschrieben 10. Mai 2011 - 18:06

Hiho die Gemeinde,

ein anderer Tag, ein neues Problem (und das bei diesem Wetter *stoehn* ).

Kleiner Ausschnitt aus dem Quellcode (kmpl. Quellcode hier: Angehängte Datei  agent_ED.txt (1,93K)
Anzahl der Downloads: 217 )
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;overflow:auto'>
public string GetDataAsString(int bytelist)
{
byte[] cData;
if (bytelist == 0)
{
cData = _sdata;
}
else
{
cData = _tdata;
}
string datastring = "";
index = -1;
while (this.MoveNext(cData)) // <--- hier alternativ auch: while (true)
{
datastring += cData[index];
}
return datastring;
}
</div>

_sdata und _tdata sind Byte-Arrays.

_sdate wird per File.ReadAllBytes(param) gefüllt.

Leider ist das Ganze sowas von lahm... nur ca. 7000 Arrayelemente pro Sekunden werden 'kopiert'. Ab ca. 70KB Dateigröße kann da fast 'n Caffee gekocht werden (so richtig mit Keramik-Filtertütenaufsatz und so).
Ich komme aber auch mit den String-Konstrucktoren nicht weiter.

Gibt es da evtl. eine andere, gern auch elegantere Lösung? Ach andere Hilfestellungen zur Beschleunigung sind gern gesehen.


Dank schonmal

greetz
Joey

Dieser Beitrag wurde von nobido bearbeitet: 26. August 2011 - 07:45

0

Anzeige



#2 Mitglied ist offline   [Elite-|-Killer] 

  • Gruppe: aktive Mitglieder
  • Beiträge: 762
  • Beigetreten: 02. Oktober 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Passau

geschrieben 13. Mai 2011 - 01:45

StringBuilder?
0

#3 _nobido_

  • Gruppe: Gäste

geschrieben 13. Mai 2011 - 04:32

Hab ich auch schon probiert.

Komme ich allerdings: 1. nicht wirklich zurecht mit und infolge dessen 2. zu keinem Ergebnis.
0

#4 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 13. Mai 2011 - 06:29

public  string ByteArrayToString(byte[] arr)
{
	System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
	return enc.GetString(arr);
}

0

#5 _nobido_

  • Gruppe: Gäste

geschrieben 13. Mai 2011 - 08:23

Hiho Witi,

Dank für die Antwort. Ist ganz sicher auch feiner Code, den ich an anderer Stelle verwenden kann.
Alternativ könnte man hier auch string rueckgabewert = new string(arraylist) nutzen.
Löst nur leider mein Problem nicht.

Ich will ja die Bytewerte nicht in Zeichen umwandeln, sondern ich möchte die Bytewerte, z.B. 20, 85, 119 etc. blablabla, in den String pressen. Soll also sowas wie 2085119 als string zurück gegeben werden.


greetz
Joey

Dieser Beitrag wurde von nobido bearbeitet: 13. Mai 2011 - 08:27

0

#6 Mitglied ist offline   Ludacris 

  • Gruppe: Moderation
  • Beiträge: 4.668
  • Beigetreten: 28. Mai 06
  • Reputation: 218
  • Geschlecht:Männlich

geschrieben 13. Mai 2011 - 21:57

for(i=o; i<=bytearray.length(); i++){
stringarray[i]=convert.toString(bytearray[i]);
}

sowas in die richtung könnte gehn
0

#7 _nobido_

  • Gruppe: Gäste

geschrieben 14. Mai 2011 - 07:45

Hiho Ludacris,

 Zitat (Ludacris: 13.05.2011, 22:57)

for(i=o; i<=bytearray.length(); i++){
stringarray[i]=convert.toString(bytearray[i]);
}

sowas in die richtung könnte gehn


das funktioniert tatsaechlich (aus i = o hab ich einfach mal i=0 gemacht und die Klammern bei bytearray.lenght entfernt :( ). Sowas aenliches gibt es auch bei den String-Konstruktoren.
Problem hierbei: ich kann das Array nur per String.Lines an den zu erzeugenden String uebergeben. Dabei entsteht zwar ein String, aber jeder Wert steht in einer neuen Zeile - soll er aber nicht.
Soll halt direkt angehaengt werden, etwa in der Form String += Convert.ToString(Array[i]);.
Nur das dauert halt ewig lang, weil der string sich da stendig selbst aufruft (wohl in der form string neuerString = alterString + anzuhaengenderWert), was halt ewig lang dauert. Und bei Dateien so ab 50 KB kann man dabei fast nen Caffe trinken.


Ich war ja schon am ueberlegen das in reinem C/C++ zu schreiben (NICHT unter .NET) und als DLL zu kompilieren. Ich denke das duerfte um einiges schneller laufen.
Hier fehlt mir allerdings dann das Wissen, wie ich diese DLL, die ja nicht unter .NET geschrieben sein wird, in C# einbinde.


joar.
Dank trotzdem und nettes WE

Dieser Beitrag wurde von nobido bearbeitet: 14. Mai 2011 - 07:48

0

#8 Mitglied ist offline   Ludacris 

  • Gruppe: Moderation
  • Beiträge: 4.668
  • Beigetreten: 28. Mai 06
  • Reputation: 218
  • Geschlecht:Männlich

geschrieben 14. Mai 2011 - 09:08

jop das o war ein tippfehler und bei den klammern war ich mir nicht mehr sicher, ich hoff du kommst noch weiter, wenn ich was finde sag ichs dir!
0

#9 _nobido_

  • Gruppe: Gäste

geschrieben 16. Mai 2011 - 19:31

Hiho,

hab mal ein wenig an meiner Klasse gebastelt.
Insbesondere an der Methode GetDataAsString. Die sieht nun folgendermaßend aus:

CODE
public string GetDataAsString(int bytelist)
{
byte[] cData;
if (bytelist == 0)
{
cData = _sdata;
}
else
{
cData = _tdata;
}

String[] _arrOut = new string[cData.Length];
String _datastring = String.Empty;

DateTime dstart = DateTime.Now;
int Zeit = 0;

for (int i = 0; i < cData.Length; i++)
{
_arrOut[i] = cData[i].ToString();
}

_datastring = String.Join("", _arrOut);

Zeit = DateTime.Now.Subtract(dStart).Milliseconds;

return _datastring;
}



Einen Haltepunkt bei return _datastring gesetzt und mir mal den Wert der Variablen Zeit angeguckt. Und siehe da: liegt so ca. bei 300 (ms). Das heißt für mich dann: Die Rückgabe scheint Ewigkeiten zu dauern.

Nun schwebt mir vor eine Referenz auf die Textbox, in die der String soll, an die Methode zu übergeben. Komme an dieser Stelle aber nicht weiter. Hat da evtl. wer eine Idee, oder einen anderen Lösungsansatz? Also, wie ich entweder eine Referenz auf die Textbox an die Methode übergebe, oder aber wie ich den String "schneller" zurück gegeben bekomme?


greetz
Joey

Dieser Beitrag wurde von nobido bearbeitet: 16. Mai 2011 - 19:33

0

#10 Mitglied ist offline   Ludacris 

  • Gruppe: Moderation
  • Beiträge: 4.668
  • Beigetreten: 28. Mai 06
  • Reputation: 218
  • Geschlecht:Männlich

geschrieben 17. Mai 2011 - 12:03

 Zitat (nobido: 16.05.2011, 20:31)

Hiho,

hab mal ein wenig an meiner Klasse gebastelt.
Insbesondere an der Methode GetDataAsString. Die sieht nun folgendermaßend aus:

CODE
public string GetDataAsString(int bytelist)
{
byte[] cData;
if (bytelist == 0)
{
cData = _sdata;
}
else
{
cData = _tdata;
}

String[] _arrOut = new string[cData.Length];
String _datastring = String.Empty;

DateTime dstart = DateTime.Now;
int Zeit = 0;

for (int i = 0; i < cData.Length; i++)
{
_arrOut[i] = cData[i].ToString();
}

_datastring = String.Join("", _arrOut);

Zeit = DateTime.Now.Subtract(dStart).Milliseconds;

return _datastring;
}



Einen Haltepunkt bei return _datastring gesetzt und mir mal den Wert der Variablen Zeit angeguckt. Und siehe da: liegt so ca. bei 300 (ms). Das heißt für mich dann: Die Rückgabe scheint Ewigkeiten zu dauern.

Nun schwebt mir vor eine Referenz auf die Textbox, in die der String soll, an die Methode zu übergeben. Komme an dieser Stelle aber nicht weiter. Hat da evtl. wer eine Idee, oder einen anderen Lösungsansatz? Also, wie ich entweder eine Referenz auf die Textbox an die Methode übergebe, oder aber wie ich den String "schneller" zurück gegeben bekomme?


greetz
Joey



hab mich jetzt nicht in deine funktion eingelesen aber das auslesen aus der textbox geht mittels
string variablenname = convert.toString(textBox1.Text)
- das geht dann auch direkt nur müsstest du dann jedes element einzeln eintippen (wo sind die daten eigentlich, wenn in einer textdatei dann könntest du sie doch direkt mit der convert.ToString() funktion als string einlesen
0

#11 Mitglied ist offline   Mr. Floppy 

  • Gruppe: VIP Mitglieder
  • Beiträge: 4.115
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 17. Mai 2011 - 13:19

Könntest Du uns verraten, was Dein Programm machen soll? Das kommt mir alles sehr umständlich vor. Wenn Du den String brauchst, warum speicherst Du ihn nicht in der Klasse? Der Dateiinhalt müßte lediglich in eine Variable geladen werden. Arrays kann man da immer noch draus machen. Man würde sich aber das Joinen sparen. Und so Sachen wie MoveNext oder das unnötige _arrOut aus dem letzten Codeschnipsel machen die Geschichte auch nicht unbedingt schneller :police:
0

#12 _nobido_

  • Gruppe: Gäste

geschrieben 17. Mai 2011 - 13:28

Hiho der Ludacris,

also String varName = Textbox1.text ist soweit klar. Das ist ja auch nicht das Problem.

Das Problem ist: Ich habe in meiner Klasse (siehe erstes Post --> Klasse als Textfile angefügt) eine Methode namens GetDataAsString. Diese Klasse binde ich in meine Windows-Forms-Anwendung ein.

In dieser dieser Anwendung (der Form) ist eine Textbox. Und in diese Textbox möchte ich gern den Inhalt des erzeugten String (der Methode GetDataAsString aus der Klasse) einfügen. Und das dauert halt ewig lang - länger, als wenn ich z.B. den String vorher in eine Datei schreibe und dann z.B. mit TextBox1.Text = File.ReadAllLines(Dateiname) einlesen würde. Und das kanns ja net sein...

Deswegen dachte ich, es funktioniert evtl., wenn ich eine Referenz auf die entsprechende Textbox an die Methode in der Klasse übergebe. Was allerdings weder per ref - Parameter noch per out - Parameter möglich ist (VS gibt da eine Fehlermeldung aus).

joar... immer noch am gucken, versuchen (und verzweifeln).



*edit @ MrFloppy*
Das Programm/die Klasse soll dazu dienen Dateien symmetrisch zu verschlüsseln (momentan wohl noch sehr noob-style, ist mir durchaus klar, aber darum geht's net).

Und das die Eine oder Andere Sache die Angelegenheit nicht unbedingt schneller machen ist mir soweit JETZT auch klar. Ich brauche halt den String aus GetDataAsString, um die Binärwerte (der unverschlüsselten als auch verschlüsselten Datei) in eine Textbox zu bringen. Und ich möchte gern alle Operationen innerhalb der Klasse ablaufen lassen und nur Werte aus dieser zurückgeben.

Da soll nix zu nem Array gemacht werden, das ist nach dem Einlesen der Datei ja vorhanden.

*edit ende*

greetz



p.s. wenn mein(e) "Problem(e)" auf einem zu niedrigen Niveau für dieses Forum liegen sollte(n) - einfach posten. Dann lass ich das hier und gucke anderswo weiter. Will ja niemanden nerven :police:

Dieser Beitrag wurde von nobido bearbeitet: 17. Mai 2011 - 13:36

0

#13 Mitglied ist offline   Ludacris 

  • Gruppe: Moderation
  • Beiträge: 4.668
  • Beigetreten: 28. Mai 06
  • Reputation: 218
  • Geschlecht:Männlich

geschrieben 17. Mai 2011 - 13:46

nene wir versuchen schon zu helfen :police: ich werd schaun was ich zusammenzaubern kann
0

#14 Mitglied ist offline   UweKeim 

  • Gruppe: aktive Mitglieder
  • Beiträge: 25
  • Beigetreten: 08. Juli 11
  • Reputation: 1
  • Geschlecht:Männlich
  • Wohnort:Göppingen
  • Interessen:Software-Entwickeln ;-)

geschrieben 08. Juli 2011 - 19:29

Bei Performance-Engpässen gelten für mich 2 Regeln:

- Premature Optimization ist die Wurzel allen Übels :imao:
- Alle Annahmen, was langsam ist waren stets falsch.

Ich gehe daher immer so vor, dass ich einen Performance-Profiler verwende, um meinen Code zu analysieren und dann die Stellen zu finden, die tatsächlich falsch sind.

Wir verwenden Red Gate ANTS Performance und Memory Profiler in der Firma, aus meiner Sicht das beste Tool dafür im .NET-Umfeld:

http://www.red-gate.com/products/dotnet-de...mance-profiler/

Gibt eine 14-tägige Testversion.
0

#15 _nobido_

  • Gruppe: Gäste

geschrieben 22. Juli 2011 - 09:14

*huch, grad erst gesehen dass es eine neue Antwort gibt*

Hiho Uwe,

Dank für deinen Beitrag. Habe ja nicht erwartet hier noch was zu finden.

Allerdings: Ich weiß jetzt nicht wie mir das weiterhelfen soll!

Weil, soweit ich das jetzt nachvollzogen habe funktioniert die Arry-Operation ja danz wunderbar fix.
Nur das umwandeln/zuweisen an (in) die Textbox dauert halt (ca 12 Sekunden bei 80.000 Zeichen) - Ohne das Array in die Textbox zu schreiben ist die Methode ja in knapp 1 Sekunde abgearbeitet...


joar

greetz


p.s. schlechtschreibfehler dürft ihr heute behalten, sind geschenkt :)

Dieser Beitrag wurde von nobido bearbeitet: 22. Juli 2011 - 09:15

0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0