Toon posts:

[Delphi] TMemoryStream langzaam

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een functie dat text omzet in integers. Mijn vorige code werkte zo, dat wanneer ik een letter uit de richedit had gelezen, het direct om werd gezet naar een getal en gelijk aan een bestand werd toegevoegd.

Aangezien dit vrij langzaam was wilde ik het geheugen daar voor gebruiken. Hiervoor wilde ik TMemoryStream gebruiken maar het blijkt dat die (bijna) net zo langzaam is. Dit is de code die ik hiervoor gebruik:

code:
1
2
3
4
5
6
7
8
9
TS := TMemoryStream.Create;
ts.SetSize(x4);
ts.Position := 0;
  {loop van een tig aantal keer}
    ts.Seek(x,SoFromBeginning);
    ts.Write(x1,SizeOf(integer));
  {einde loop}
ts.SaveToFile(s1);
ts.free;


Heeft iemand een beter idee of doe ik wat fout?

codeer/decodeer verhouding = 12 {ongeveer}

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 22:26

Tomatoman

Fulltime prutser

Wat zijn x4, x, x1 en s1? Wat bedoel je met codeer/decodeerverhouding? Waarom overschrijf je 1000 keer de eerste vier bytes in de memorystream?

Een goede grap mag vrienden kosten.


Verwijderd

Topicstarter
Het gaat mij om het geheel..

Laten we het erop houden dat alles werkt, alleen is de gebruikte methode langzaam.

Weet iemand een snellere methode.

Wat betreft de verhouding; die heeft de eenheid seconden

[ Voor 17% gewijzigd door Verwijderd op 01-04-2003 21:03 ]


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 22:26

Tomatoman

Fulltime prutser

* Tomatoman voelt zich genegeerd.

Als jij niet de moeite wilt nemen om uit te leggen wat je probleem nou eigenlijk is, waarom zouden wij dan de moeite nemen om jou probleem op te lossen? :(

Een goede grap mag vrienden kosten.


Verwijderd

Topicstarter
Wat snap je niet dan? Het lijkt mij duidelijk.

TMemorystream levert niet de performance die ik graag wil zien. De variabelen zijn niet interessant om uit te leggen als je weet hoe streams werken.

Om nog even heel kort uit te leggen waar het om gaat:

- In een richedit staat tekst (veel tekst (bij voorkeur))
- Ik zet deze tekst omzetten in getallen
- Ik schrijf deze weg in een bestand
- Ik heb hiervoor gebruikt; "FileOfInteger" en nu dus "TMemoryStream"

Beide leveren geen snelle performance. Wat zijn er nog meer voor opties?

Duidelijker kan niet....

{Vat het trouwens niet zo persoonlijk op. Ik wil niet van die eindeloze posts van: deze variabele moet zus of zo, de komma moet ondersteboven enz.}

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 21:47
offtopic:
principe 1 van programeren: gebruik duidelijke variablen-naamgeving!


Ik kan me trouwens voorstellen dat het nogal traag is als je een stream gebruikt als variable... Althans, dat is wat ik opmaak uit jouw geposte code.

Maar eerlijk gezegd, denk ik eerder dat je probleem elders zit. Hoe zet jij je tekst om in integers?

[ Voor 29% gewijzigd door Jelmer op 01-04-2003 21:48 ]


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 22:26

Tomatoman

Fulltime prutser

Het is me nog steeds totaal onduidelijk waarom je tig keer (stond daar eerst niet 1000 keer? :/) dezelfde 4 bytes (altijd op positie x) in de memorystream overschrijft. Als je de eerste tig - 1 overbodige keren overslaat, win je vast aan performance.

En je hebt ook nog steeds niet uitgelegd wat je met 'coderen' bedoelt.
{Vat het trouwens niet zo persoonlijk op. Ik wil niet van die eindeloze posts van: deze variabele moet zus of zo, de komma moet ondersteboven enz.}
Maak je geen zorgen, no offence taken. Er had net zo goed kunnen staan "* Tomatoman heeft de indruk dat Name? de hint niet heeft begrepen."

[ Voor 5% gewijzigd door Tomatoman op 01-04-2003 22:11 ]

Een goede grap mag vrienden kosten.


Verwijderd

Topicstarter
De tekst zet ik op deze manier om:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var
  s : string;
  c : char;
  a : integer;
  y : extended; {hmm.. deze kan ik ook beter veranderen in real}

{in de loop}

  s := form1.richedit1.text;
  c := s[x];
  a := ord(c);
  {Met a doe ik nog niet echt veel bijzonders. 
  Gewoon nog even vermenigvuldigen met een nummertje 
  (niet echt interessant dus -> 
  eerst even een geoptimaliseerde code}

{aansturing ProgressBar}

  y := (x / x1) * 100;
  y1 := Trunc(y);
  Form1.TrackBar1.SelEnd := y1;

[ Voor 23% gewijzigd door Verwijderd op 01-04-2003 22:16 ]


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 22:26

Tomatoman

Fulltime prutser

Nu wordt het mij opeens duidelijk. Waarschijnlijk gaat 99% van de processortijd in het refreshen van de progress bar zitten. Volgende keer toch maar wat meer aandacht aan de topicstart besteden?

[ Voor 5% gewijzigd door Tomatoman op 01-04-2003 22:16 ]

Een goede grap mag vrienden kosten.


Verwijderd

Topicstarter
Hmm, zou het?

Nog nooit zo over na gedacht :)

Bij the way:

Ik zal in het vervolg wel wat gematigder reageren. Ik dacht namelijk echt dat het puur en alleen aan de methode van de gegevens wegschrijven lag.

Verwijderd

Topicstarter
Ik ben eruit :)

Een tweetal dingen veranderd/verbetert.

code:
1
2
3
4
5
6
s := richedit1.text; {met m'n suffe bol in de loop gezet}

{dit in de loop veranderd/toegevoegd}

c := s[1];
delete(s,1,1);


Nu loopt ie als een speer. Kunnen we aan het echte werk beginnen :)

Hij is nu zowat sneller als de decoder.....

[ Voor 9% gewijzigd door Verwijderd op 01-04-2003 23:13 ]


  • Apache
  • Registratie: Juli 2000
  • Laatst online: 17-08 14:28

Apache

amateur software devver

Nooit verbaast zijn als iemand die je code moet maintainen je ff in je kloten komt slaan omwille van je variable namen (zoals hierboven al gemeld) ;)

If it ain't broken it doesn't have enough features

Pagina: 1