Jan schrieb:
Hallo Winfried,

ich weiß das ich die Makros nicht kommentiere. Aber ich weiß was sie anstellen.

Die tatsächlichen Zeitfresser? Meine Vermutung liegt beim löschen von Tabellenblättern. Es ist erschütternd wie lange Openoffice auch ohne Makro dafür benötigt, um lediglich Tabellenblätter zu vernichten.

Dann gibt es noch die Möglichkeit die Sache zu optimieren.
Löschen von Tabellenblättern geht z.b. sehr schnell mit...
---------------schnipp

rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:SelectAll", "", 0, Array())

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Flags"
args2(0).Value = "A"

dispatcher.executeDispatch(document, ".uno:Delete", "", 0, args2())

-------------schnapp
In anderen Modulen beobachte ich das gleiche Verhalten. Prozeduren an sich sind sehr schnell. Werden aber plötzlich große Daten bewegt, und eine solche Prozedur danach aufgerufen, wird sie derart langsam.


> Bei 3*20*40 Durchläufen in VERTEILUNG() vermisse ich auf den ersten
> Blick die Ausführung im Hintergrund (FRAME->HIDDDEN).
>

Wenn du 2400 Aufrufe einer Subroutine machst, dann prüfe ob da evtl. Müll nach jedem Aufruf überbleibt oder ob Variablen überladen werden. (Ich habe das jetzt nur grob getestet und weiss das Compiler so etwas selbst optimieren - aber ich weiss nicht
wie der Starbasic Interpreter das macht...)

Folgendes Beispiel:

Routine tuewas
  dim a as integer
  dim b as string
  dim i as integer
  for i = 1 to 32000
     a=100
     b="Schöner leerer String"
     call tuewasanderes
  next i
end

Routine tuewasanderes
  dim a as integer
  dim b as object
  dim x as string
  x="Noch ein String"
  a = lenght(x)
  b= 4
end

Jedes mal wenn die Routine "tuewasanderes" aufgerufen wird, muss Speicher für a,b und x reserviert werden. Jedes mal wenn diese Routine zu Ende ist, wird der Speicher wieder frei gegeben. Je komplexer die Variablen sind (Bei Starbasic z.B. Objecte)
um so mehr Verwaltungsaufwand entsteht. Und auch mehr Speichermüll.

Wenn du in einem solchen Fall, die Variablen a, b und x Global deklarierst, entfällt diese SpeicherEi. Allerdings sind die Variablen dann beim Aufruf der Routine noch mit dem Inhalt des letzten Aufrufes belegt (also undefiniert). Sie sollte daher gleich als erstes innerhalb der Routine auf einen Wert gebracht werden. Und die Variablen haben natürlich dann in allen Funktionen Gültigkeit. D.h. Die Variable a und b und x gelten Global, und dürfen dann nicht in Routinen deklariert werden.

Ich habe das wie gesagt nur im kleinen getestet (und auch nur mit long - Werten) aber, Ich komme mit 100000 Schleifendurchläufen einmal auf 3 und einmal auf 21 Sekunden. Je nach dem wie ich es mache....

Vielleicht hilfts?

mfg
Volker

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@de.openoffice.org
For additional commands, e-mail: users-h...@de.openoffice.org

Antwort per Email an