Wie ich feststellen musste, gibt es in LotusScript erhebliche Performanceunterschiede
bei dem Befehl Instr, je nachdem ob man ihn case-sensitiv verwendet
oder nicht. Mit erheblich meine ich so ungefähr 900 mal langsamer, wenn
der Befehl Instr mit der Option "case-insensitive, pitch-insensitive"
ausgeführt wird.
Bei relativ kurzen Texten fällt es nicht
weiter auf. Wenn die Texte allerdings länger werden, macht es sicht deutlich
bemerkbar. Für das Beispiel mit der ca. 900 langsameren Ausführung habe
ich einen relativ langen "Lorem ipsum" Text (5539 Zeichen) zehn
mal aneinandergehängt. Um die Unterschiede messen zu können, habe ich den
Instr-Befehl jeweils 1000 mal durchlaufen lassen. Zum Messen habe ich eine
Profiling-Routine verwendet, die Thomas Bahn geschrieben hat.
For
i = 1 To 10
text
= text &
CRLF & text
Next
For i = 1 To 1000
Call
StartProfiling("InstrTest", "case-sensitiv")
pos =
Instr(text, "Defacto")
Call
StopProfiling("InstrTest", "case-sensitiv")
Next
For i = 1 To 1000
Call
StartProfiling("InstrTest", "case-insensitiv")
pos =
Instr(1,
text, "Defacto",5)
Call
StopProfiling("InstrTest", "case-insensitiv")
Next
Call LogProfiles()
Das Ergebnis ist recht beeindruckend.
| Option
| Aufrufe
| Ausführungszeit
insgesamt
| Ausführungszeit
durchschnittlich
|
| case-insensitiv
| 1000
| 459,640
| 0,45964
|
| case-sensitiv
| 1000
| 0,063
| 0,00006 |
Weil ich aber sicherstellen musste,
dass ich unabhängig von der Groß-/Kleinschreibung alle Treffer finde und
trotzdem diesen Performanceeinbruch nicht in Kauf nehmen wollte, musste
ich mir etwas einfallen lassen. Wie so häufig wurde die Performancesteigerung
durch einen höheren Speicherbedarf erkauft. Der zu durchsuchende Text wurde
in eine neue Variable geschrieben und anschließend alles auf Kleinschreibung
geändert. Die Position des Suchwortes wurde dann in dem kleingeschriebenen
Text bestimmt.
For
i = 1 To 1000
Call
StartProfiling("InstrTest", "case-sensitiv mit Lcase")
textSmallLetters = Lcase(text)
pos =
Instr(textSmallLetters, Lcase("Defacto"))
Call
StopProfiling("InstrTest", "case-sensitiv mit Lcase")
Next
Die Durchlaufzeit konnte dadurch stark
reduziert werden. Sie aber immer noch nicht annährend so schnell wie bei
der case-sensitiven Option. Aber für meine Anwendung hat es gereicht.