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