LL31 CrossPlattform rendert sehr langsam für spezifischen Input

Hallo,
beim arbeiten mit LL31 CrossPlatform ist uns folgendes aufgefallen:

Wir haben ein Template vorliegen das sehr lange zum rendern braucht. Wir haben herausgefunden das es an folgendem Abschnitt liegt:

ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(
EINGABETEXT,
“AK1|”,“Längerer Text der hier eingesetzt wird 1”),
“AK2|”,“Längerer Text der hier eingesetzt wird 2”),
“AK3|”,“Längerer Text der hier eingesetzt wird 3”),
“AK4|”,“Längerer Text der hier eingesetzt wird 4”),
“AK5|”,“Längerer Text der hier eingesetzt wird 5”),
“AK6|”,“Längerer Text der hier eingesetzt wird 6”),
“AK7|”,“Längerer Text der hier eingesetzt wird 7”),
“AK8|”,“Längerer Text der hier eingesetzt wird 8”),
“AK9|”,“Längerer Text der hier eingesetzt wird 9”),
“AK10|”,“Längerer Text der hier eingesetzt wird mit Datum: " + Month$(DATEVARIABLE) + “/”+Year$(DATEVARIABLE) + “.”),
“AK11|”,“Längerer Text der hier eingesetzt wird mit Datum: " + date$(DATEVARIABLE,‘%x’) +” Text nach Datum”),
“AK12|”,"Anderer Text "),
“AK13|”,“Längerer Text der hier eingesetzt wird 10”),
“AK14|”,“Längerer Text der hier eingesetzt wird 11”),
“AK15|”,“Längerer Text der hier eingesetzt wird 12”),
“AK16|”,“Längerer Text der hier eingesetzt wird 13”),
“AK17|”,“Längerer Text der hier eingesetzt wird 14”),
“AK18|”,“Längerer Text der hier eingesetzt wird 15”),
“AK19|”,“Längerer Text der hier eingesetzt wird 16”),
“AK20|”,“Längerer Text der hier eingesetzt wird 17”),
“AK21|”,“Längerer Text der hier eingesetzt wird 18”),
“AK22|”,“Längerer Text der hier eingesetzt wird 19”),
“AK23|”,“Längerer Text der hier eingesetzt wird 20”),
“AK24|”,“Längerer Text der hier eingesetzt wird 21”),
“AK25|”,“Längerer Text der hier eingesetzt wird 22”),
“AK26|”,“Längerer Text der hier eingesetzt wird 23”),
“AK27|”,“Längerer Text der hier eingesetzt wird 24”),
“AK28|”,“Längerer Text der hier eingesetzt wird 25”),
“AK29|”,“Längerer Text der hier eingesetzt wird 26”),
“AK30|”,“Längerer Text der hier eingesetzt wird 27”),
“AK31|”,“Längerer Text der hier eingesetzt wird 28”),
“AK32|”,“Längerer Text der hier eingesetzt wird 29”),
“AK33|”,“Längerer Text der hier eingesetzt wird 30”)

Der Abschnitt soll Abkürzungen durch entsprechende, längere Texte ersetzen. (Abkürzungen und Texte sind hier etwas generisch ersetzt sind aber jeweils etwa in den gegebenen Format)

Wenn wir den Code mit wenigen (~5 Aufrufen) testen läuft der Code schnell (keine merkliche Verzögerung), mit etwas mehr (~15 Aufrufen) ist schon eine erhebliche Verlangsamung spürbar. Mit den über 30 Aufrufen im Beispiel oben konnten wir bisher kein Beispiel rendern. Handelt es sich hierbei um einen Bug oder ist an dem Verhalten leider nichts zu ändern? Könnt ihr uns einen Tipp geben wie wir das Template entsprechend für das gleiche Verhalten umschreiben können?

Vielen Dank im Voraus
Daniel Schild

Das sehen wir uns einmal an - ich gehe davon aus, dass sich da was optimieren lässt.

Als Testcode haben wir


using ListLabel ll = new ListLabel();

for (int i = 0; i < 100000; i++)
{
    ExpressionValue val = ll.EvaluateExpression("ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(ReplaceStr$(\n\"AK1| Bla bla AK3|\",\n\"AK1|\",\"Längerer Text der hier eingesetzt wird 1\"),\n\"AK2|\",\"Längerer Text der hier eingesetzt wird 2\"),\n\"AK3|\",\"Längerer Text der hier eingesetzt wird 3\"),\n\"AK4|\",\"Längerer Text der hier eingesetzt wird 4\"),\n\"AK5|\",\"Längerer Text der hier eingesetzt wird 5\"),\n\"AK6|\",\"Längerer Text der hier eingesetzt wird 6\"),\n\"AK7|\",\"Längerer Text der hier eingesetzt wird 7\"),\n\"AK8|\",\"Längerer Text der hier eingesetzt wird 8\"),\n\"AK9|\",\"Längerer Text der hier eingesetzt wird 9\"),\n\"AK10|\",\"Längerer Text der hier eingesetzt wird mit Datum: \" + Month$(Date(\"01.01.2026\")) + \"/\"+Year$(Date(\"01.01.2026\")) + \".\"),\n\"AK11|\",\"Längerer Text der hier eingesetzt wird mit Datum: \" + date$(Date(\"01.01.2026\"),'%x') +\" Text nach Datum\"),\n\"AK12|\",\"Anderer Text \"),\n\"AK13|\",\"Längerer Text der hier eingesetzt wird 10\"),\n\"AK14|\",\"Längerer Text der hier eingesetzt wird 11\"),\n\"AK15|\",\"Längerer Text der hier eingesetzt wird 12\"),\n\"AK16|\",\"Längerer Text der hier eingesetzt wird 13\"),\n\"AK17|\",\"Längerer Text der hier eingesetzt wird 14\"),\n\"AK18|\",\"Längerer Text der hier eingesetzt wird 15\"),\n\"AK19|\",\"Längerer Text der hier eingesetzt wird 16\"),\n\"AK20|\",\"Längerer Text der hier eingesetzt wird 17\"),\n\"AK21|\",\"Längerer Text der hier eingesetzt wird 18\"),\n\"AK22|\",\"Längerer Text der hier eingesetzt wird 19\"),\n\"AK23|\",\"Längerer Text der hier eingesetzt wird 20\"),\n\"AK24|\",\"Längerer Text der hier eingesetzt wird 21\"),\n\"AK25|\",\"Längerer Text der hier eingesetzt wird 22\"),\n\"AK26|\",\"Längerer Text der hier eingesetzt wird 23\"),\n\"AK27|\",\"Längerer Text der hier eingesetzt wird 24\"),\n\"AK28|\",\"Längerer Text der hier eingesetzt wird 25\"),\n\"AK29|\",\"Längerer Text der hier eingesetzt wird 26\"),\n\"AK30|\",\"Längerer Text der hier eingesetzt wird 27\"),\n\"AK31|\",\"Längerer Text der hier eingesetzt wird 28\"),\n\"AK32|\",\"Längerer Text der hier eingesetzt wird 29\"),\n\"AK33|\",\"Längerer Text der hier eingesetzt wird 30\")");
}

verwendet. Die Berechnung benötigt auf meinem Rechner hier ca. 3,5 Sekunden (bei 100000 Aufrufen). Insofern können wir das nicht direkt nachvollziehen, zumindest nicht den Zusammenhang mit dem genannten Ausdruck. Hättest du die Möglichkeit, uns einmal ein volles Sample zukommen zu lassen?

Um diese Frage noch zu beantworten - ich würde das in eine eigene Designerfunktion packen (die werden auch von LLCP unterstützt). Sowas wie ReplaceAbbreviations(...). Je nachdem ob die Abkürzungen vom Benutzer selbst bearbeitet werden sollten könnte die Syntax für deine Funktion z. B. so aussehen:

ReplaceAbbreviations(INPUT, "AK1=Hallo|AK2=Welt")

und im Code würdest du das zweite Argument in ein Dictionary o. ä. verwandeln und dann in einer Schleife die Ersetzungen machen. Das wäre für den Endanwender auch etwas einfacher zu verstehen und Editieren.

Die Designer-Funktionen sind hier dokumentiert:

Designer um eigene Funktion erweitern

Trotzdem würde ich das Performance-Leak gerne untersuchen können, wenn du uns da noch Input hast wäre es toll.

Hallo,

vielen Dank für die schnelle Antwort. Das definieren von Designerfunktionen hilft uns hier aufjedenfall weiter. Damit wird die Funktionalität schonmal sehr viel aufgeräumter.:+1:

Das orginal Template kann ich leider nicht versenden. Das gleiche Verhalten bekomme ich aber in einem neuen Template auch nichtmehr reproduziert. Wir haben inzwischen eine Vermutung zu dem Problem: Einer der replacement-Strings hatte einen Variablenaufruf mit einem Umlaut enthalten, hier gab es in der Kommunikation augenscheinlich Encoding Probleme.

Alles klar - wenn sich das Problem nochmal zeigen sollte - jederzeit gerne melden, ggf. auch über einen Support Case, dann ist der Datenschutz auch gewährleistet. Dann mache ich diesen Thread einstweilen zu :slight_smile:. Viel Erfolg weiter mit LLCP!