Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Code beschleunigen (https://www.delphipraxis.net/112938-code-beschleunigen.html)

Grolle 29. Apr 2008 21:45


Code beschleunigen
 
Hallo,

ich suche und ersetze Text in einer Excel-Spalte mit folgendem Code:
Delphi-Quellcode:
  Application.ProcessMessages;
  for i := 0 to sl.Count-1 do
  begin
    Label6.Caption := IntToStr(i);
    Label6.Refresh;
    if sl[i] <> '' then
    begin
      arr := explode(';',sl[i]);
      for j := 1 to 5324 do
      begin
        help := Sheet.Cells[j,13].Value;
        help := StringReplace(help,arr[0],arr[1],[rfReplaceAll]);
        Sheet.Cells[j,13].Value := help;
      end;
      arr := nil;
    end;
  end;
Beide Schleifen werden ca. 5300 mal durchlaufen. Wie kann ich da an der
Gechwindigkeit noch was drehen? (sl ist eine StringList)

Viele Grüße ...

stoxx 29. Apr 2008 22:41

Re: Code beschleunigen
 
StringReplace vom FastCode Projekt oder die JEdi Sachen sind auch schon schneller als Delphi ..

Eine Kopie sparen:

Delphi-Quellcode:
Sheet.Cells[j,13].Value := StringReplace(help,arr[0],arr[1],[rfReplaceAll]);
das langsamste wird aber wohl der Excel Zugriff sein.

Grolle 29. Apr 2008 22:43

Re: Code beschleunigen
 
Hi,

nein, ich ersetze einen String. arr ist ein dynamisches Array.

Viele Grüße ...

mkinzler 29. Apr 2008 22:44

Re: Code beschleunigen
 
Ist Excel während des Vorgangs sichtbar?

Grolle 29. Apr 2008 22:45

Re: Code beschleunigen
 
Im Moment schon. muss aber nicht!

mkinzler 29. Apr 2008 22:46

Re: Code beschleunigen
 
Es sollte dann schneller sein.

Grolle 29. Apr 2008 22:48

Re: Code beschleunigen
 
Hmm ich glaube ein par Sekunden bringt das schon. Ein Durchlauf der ersten Schleife dauert aber
immer noch ~ 24 Sek. Kann das sein?

stoxx 29. Apr 2008 22:50

Re: Code beschleunigen
 
Zitat:

Zitat von Grolle
Hmm ich glaube ein par Sekunden bringt das schon. Ein Durchlauf der ersten Schleife dauert aber
immer noch ~ 24 Sek. Kann das sein?

das label nur bei jedem 10. Durchlauf aktualisieren ...

Grolle 29. Apr 2008 23:21

Re: Code beschleunigen
 
Hi,

das bringt mir nochmal ne Sekunde (Label Refresh ganz raus)!
Mann, da muss doch noch was gehen :?

lbccaleb 29. Apr 2008 23:22

Re: Code beschleunigen
 
rausnehmen kannst ja dann auch noch arr := nil;
vllt bringt dir das auch noch mal nen wenig ein..

Grolle 29. Apr 2008 23:26

Re: Code beschleunigen
 
Stimmt! Testen wir mal ...

stoxx 30. Apr 2008 02:30

Re: Code beschleunigen
 
nimm dochmal schrittweise jeden Befehl raus, und schau wo der Flaschenhals ist ..

propier doch mal:

Delphi-Quellcode:
if i Mod 10 = 0 then begin
    Label6.Caption := IntToStr(i);
    Label6.Refresh;
end;

Bernhard Geyer 30. Apr 2008 06:21

Re: Code beschleunigen
 
Ich würde darauf Tippen das 99% der Rechenzeit in den beiden Zeilen
Delphi-Quellcode:
        help := Sheet.Cells[j,13].Value;
        ...
        Sheet.Cells[j,13].Value := help;
da du einen COM-Out-Of-Process-Server verwendest. Falls du auch noch über Frühe Bindung gehst (Sheet: OleVariant) kannst du jedliche andere Optimierung vergessen. Hier solltest du über GetRange/SetRange arbeiten um den ganzen Block als Variant Array in deinen Adressraum holen. Leider kann ich dir keinen Sourcecode liefern da ich dies auch nur von einer Kaufkomponente habe. Alternativ könntest du native Excel-Format wie Flexel kaufen welche Exceldateien native laden können.

SirThornberry 30. Apr 2008 08:15

Re: Code beschleunigen
 
welche Werte haben bei dir arr[0] und arr[1]? Sind die beiden Werte gleich lang? Wenn ja - wie lang?

Sherlock 30. Apr 2008 08:21

Re: Code beschleunigen
 
Wie hast Du denn das Excel eingebunden, bzw. was genau ist Sheet? Wenn Sheet ein Variant ist, dann liegt da die Lösung. COM-Objekte als Variants verbraten enorm viel Zeit mit nichts tun.

Sherlock

RWarnecke 30. Apr 2008 09:27

Re: Code beschleunigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Es gibt zwei Möglichkeiten :

1.) Die Unit in der angehängten Datei habe ich mal gefunden und es soll laut Beschreibung, ziemlich schnell gehen.
2.) Im Excel-Makrocode kannst Du so einen String-Replace durchführen
Code:
Set Intstring = "25=>35"
Intstring = WorksheetFunction.Substitute(Intstring, "=>", "")

jbg 30. Apr 2008 11:43

Re: Code beschleunigen
 
Was auch noch ein wenig Geschwindigkeit bring ist
Code:
ExcelApp.ScreenUpdating[0] := False;
try
  ...
finally
  ExcelApp.ScreenUpdating[0] := True;
end;

Grolle 30. Apr 2008 12:45

Re: Code beschleunigen
 
Hallo nochmal und Danke an alle,

nachdem meine Funktion in der letzten Nacht 8 h für 1000 (das war nur ein/Fünftel!) Datensätze
gebraucht hat, habe ich die betroffene Excel-Spalte als Textdatei gespeichert und nach Bearbeitung
einfach wieder in Excel eingefügt (zum Glück lagen keine Formatierungen bzw. Formeln
darauf).
Der Code macht die gesammte Liste jetzt in einer Minute:
Delphi-Quellcode:
  for i := 0 to sl.Count-1 do
  begin
    Label6.Caption := IntToStr(i);
    Label6.Refresh;
    if sl[i] <> '' then
    begin
      arr := explode(';',sl[i]);
      for j := 0 to nuList.Count-1 do
      begin
        help := StringReplace(nuList[j],arr[0],arr[1],[rfReplaceAll]);
        nuList[j] := help;
      end;
    end;
  end;
Unglaublich, was Excel da an Performance schluckt :shock:

Viele Grüße ...

Sherlock 30. Apr 2008 13:18

Re: Code beschleunigen
 
Das ist nicht unbedingt Excel, was da Performance schluckt. Wäre ja auch fatal.

Du solltest versuchen, so viel wie möglich mit den Excelroutinen zu erledigen, ansonsten bewegst Du zu viel zwischen Deiner App und Excel hin und her, und je nach Einbindung von Excel kostet das Performance.

Sherlock

Grolle 30. Apr 2008 13:21

Re: Code beschleunigen
 
Zitat:

Zitat von Sherlock
Das ist nicht unbedingt Excel, was da Performance schluckt. Wäre ja auch fatal.

Du solltest versuchen, so viel wie möglich mit den Excelroutinen zu erledigen, ansonsten bewegst Du zu viel zwischen Deiner App und Excel hin und her, und je nach Einbindung von Excel kostet das Performance.

Sherlock

Hi,

da hast du Recht und so wars auch gemeint. Am liebsten wäre es mir gewesen, wenn ich das über ein Macro hätte
regeln können, aber da hätte ich mich erst einarbeiten müssen.

Viele Grüße ...

Bernhard Geyer 30. Apr 2008 13:26

Re: Code beschleunigen
 
Zitat:

Zitat von Grolle
Unglaublich, was Excel da an Performance schluckt :shock:

Es ist nicht Excel, es ist COM und vermutlich (noch keine Aussage von dir) die frühe Bindung.
Ich kann hier komplette Excel-Sheets mit mehreren 10.000 Zeilen in ein paar Sekunden einlesen. Jedoch hol ich mit das alle En-Block in einem VarArray.

Grolle 30. Apr 2008 14:00

Re: Code beschleunigen
 
Hi,

ja war die frühe Bindung!

Viele Grüße ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz