Der Folgende Code parst einen String, z.B. diesen $010;20;4;14;23;4;$
Die erste Grafik zeigt im roten Rahmen die Auslastung für diesen Block und 4 weitere Blöcke mit gleichem Code.
Wie im Code zu sehen, wird immer erst die Startposition festgelegt (0 oder altes Ende) und die Endposition per find() gesucht. Hier also 1. Strichpunkt, 2. Strichpunkt, ... bis zum letzten Strichpunkt. Es wird immer wieder von vorne angefangen zu suchen, die Suche überspringt also für den 2. Strichpunkt den 1., für den 3. wird 1 und 2 übersprungen etc. -> die Suche dauert immer länger.
[highlight=epc]
if Data_Fehler1!=$$ then \\
/* Parsen von Fehler 1 */; \\
/* Parsen von WP_Fehler_1_Code */; \\
Name_StartPos=0u16; \\
Name_EndPos=find(Data_Fehler1,$;$,0u16)-1u16; \\
WP_Fehler_1_Code=split(Data_Fehler1,Name_StartPos, Name_EndPos); \\
/* Parsen von Datum 1 */; \\
Name_StartPos=Name_EndPos+2u16; \\
Name_EndPos=find(Data_Fehler1,$;$,1u16)-1u16; \\
Fehlertag=split(Data_Fehler1,Name_StartPos,Name_En dPos); \\
Name_StartPos=Name_EndPos+2u16; \\
Name_EndPos=find(Data_Fehler1,$;$,2u16)-1u16; \\
Fehlermonat=split(Data_Fehler1,Name_StartPos,Name_ EndPos); \\
Name_StartPos=Name_EndPos+2u16; \\
Name_EndPos=find(Data_Fehler1,$;$,3u16)-1u16; \\
Fehlerjahr=split(Data_Fehler1,Name_StartPos,Name_E ndPos); \\
Jahresanpassung=convert(Fehlerjahr,0u16); \\
Jahresanpassung=2000u16+Jahresanpassung; \\
Fehlerjahr=convert(Jahresanpassung,$$); \\
WP_Fehler_1_Datum=Fehlertag+$.$+Fehlermonat+$.$+Fe hlerjahr; \\
/* Parsen von Uhrzeit 1 */; \\
Name_StartPos=Name_EndPos+2u16; \\
Name_EndPos=find(Data_Fehler1,$;$,4u16)-1u16; \\
Fehlerstunde=split(Data_Fehler1,Name_StartPos,Name _EndPos); \\
Name_StartPos=Name_EndPos+2u16; \\
Name_EndPos=find(Data_Fehler1,$;$,5u16)-1u16; \\
Fehlerminute=split(Data_Fehler1,Name_StartPos,Name _EndPos); \\
Minutenanpassung=convert(Fehlerminute,0u16); \\
if Minutenanpassung<=9u16 then \\
Fehlerminute=$0$+Fehlerminute \\
endif; \\
WP_Fehler_1_Uhrzeit=Fehlerstunde+$:$+Fehlerminute \\
endif;\\
[/highlight]
Dieses "Problem" habe ich nun umschifft, indem ich den ersten Endpunkt suche, den Teilstring dann aber abschneide und im nächsten Schritt wieder nur den 1. Strichpunkt suche.
Es wird also die Suche per find() gegen das Kürzen des Strings getauscht. Zusätzlich fällt eine Zuweisung weg, da der Start immer bei 0 ist.
Die geänderte Auslastung wird in der 2. Grafik gezeigt.
Auch hier sind im roten Rahmen insgesamt 5 solcher Blöcke gezeigt.
[highlight=epc]
/* Parsen der einzelnen Fehler */; \\
if Data_Fehler1!=$$ then \\
/* Parsen von Fehler 1 */; \\
/* Parsen von WP_Fehler_1_Code */; \\
Name_StartPos=0u16; \\
Name_EndPos=find(Data_Fehler1,$;$,0u16)-1u16; \\
WP_Fehler_1_Code=split(Data_Fehler1,Name_StartPos, Name_EndPos); \\
Data_Fehler1=split(Data_Fehler1,Name_EndPos+2u16,E ND);\\
/* Parsen von Datum 1 */; \\
Name_EndPos=find(Data_Fehler1,$;$,0u16)-1u16; \\
Fehlertag=split(Data_Fehler1,Name_StartPos,Name_En dPos); \\
Data_Fehler1=split(Data_Fehler1,Name_EndPos+2u16,E ND); \\
Name_EndPos=find(Data_Fehler1,$;$,0u16)-1u16; \\
Fehlermonat=split(Data_Fehler1,Name_StartPos,Name_ EndPos); \\
Data_Fehler1=split(Data_Fehler1,Name_EndPos+2u16,E ND); \\
Name_EndPos=find(Data_Fehler1,$;$,0u16)-1u16; \\
Fehlerjahr=split(Data_Fehler1,Name_StartPos,Name_E ndPos); \\
Data_Fehler1=split(Data_Fehler1,Name_EndPos+2u16,E ND); \\
Jahresanpassung=convert(Fehlerjahr,0u16); \\
Jahresanpassung=2000u16+Jahresanpassung; \\
Fehlerjahr=convert(Jahresanpassung,$$); \\
WP_Fehler_1_Datum=Fehlertag+$.$+Fehlermonat+$.$+Fe hlerjahr; \\
/* Parsen von Uhrzeit 1 */; \\
Name_EndPos=find(Data_Fehler1,$;$,0u16)-1u16; \\
Fehlerstunde=split(Data_Fehler1,Name_StartPos,Name _EndPos); \\
Data_Fehler1=split(Data_Fehler1,Name_EndPos+2u16,E ND); \\
Name_EndPos=find(Data_Fehler1,$;$,0u16)-1u16; \\
Fehlerminute=split(Data_Fehler1,Name_StartPos,Name _EndPos); \\
Minutenanpassung=convert(Fehlerminute,0u16); \\
if Minutenanpassung<=9u16 then \\
Fehlerminute=$0$+Fehlerminute \\
endif; \\
WP_Fehler_1_Uhrzeit=Fehlerstunde+$:$+Fehlerminute; \\
endif;\\
[/highlight]
Der Unterschied scheint erheblich zu sein. Teilweise 250ms weniger pro Block.
Vermutlich hat das find() ein Problem. Könnt Ihr bei Ennertex prüfen, warum der 2. Code so viel schneller ist und ob hier tatsächlich das find() die Ursache ist?
Die erste Grafik zeigt im roten Rahmen die Auslastung für diesen Block und 4 weitere Blöcke mit gleichem Code.
Wie im Code zu sehen, wird immer erst die Startposition festgelegt (0 oder altes Ende) und die Endposition per find() gesucht. Hier also 1. Strichpunkt, 2. Strichpunkt, ... bis zum letzten Strichpunkt. Es wird immer wieder von vorne angefangen zu suchen, die Suche überspringt also für den 2. Strichpunkt den 1., für den 3. wird 1 und 2 übersprungen etc. -> die Suche dauert immer länger.
[highlight=epc]
if Data_Fehler1!=$$ then \\
/* Parsen von Fehler 1 */; \\
/* Parsen von WP_Fehler_1_Code */; \\
Name_StartPos=0u16; \\
Name_EndPos=find(Data_Fehler1,$;$,0u16)-1u16; \\
WP_Fehler_1_Code=split(Data_Fehler1,Name_StartPos, Name_EndPos); \\
/* Parsen von Datum 1 */; \\
Name_StartPos=Name_EndPos+2u16; \\
Name_EndPos=find(Data_Fehler1,$;$,1u16)-1u16; \\
Fehlertag=split(Data_Fehler1,Name_StartPos,Name_En dPos); \\
Name_StartPos=Name_EndPos+2u16; \\
Name_EndPos=find(Data_Fehler1,$;$,2u16)-1u16; \\
Fehlermonat=split(Data_Fehler1,Name_StartPos,Name_ EndPos); \\
Name_StartPos=Name_EndPos+2u16; \\
Name_EndPos=find(Data_Fehler1,$;$,3u16)-1u16; \\
Fehlerjahr=split(Data_Fehler1,Name_StartPos,Name_E ndPos); \\
Jahresanpassung=convert(Fehlerjahr,0u16); \\
Jahresanpassung=2000u16+Jahresanpassung; \\
Fehlerjahr=convert(Jahresanpassung,$$); \\
WP_Fehler_1_Datum=Fehlertag+$.$+Fehlermonat+$.$+Fe hlerjahr; \\
/* Parsen von Uhrzeit 1 */; \\
Name_StartPos=Name_EndPos+2u16; \\
Name_EndPos=find(Data_Fehler1,$;$,4u16)-1u16; \\
Fehlerstunde=split(Data_Fehler1,Name_StartPos,Name _EndPos); \\
Name_StartPos=Name_EndPos+2u16; \\
Name_EndPos=find(Data_Fehler1,$;$,5u16)-1u16; \\
Fehlerminute=split(Data_Fehler1,Name_StartPos,Name _EndPos); \\
Minutenanpassung=convert(Fehlerminute,0u16); \\
if Minutenanpassung<=9u16 then \\
Fehlerminute=$0$+Fehlerminute \\
endif; \\
WP_Fehler_1_Uhrzeit=Fehlerstunde+$:$+Fehlerminute \\
endif;\\
[/highlight]
Dieses "Problem" habe ich nun umschifft, indem ich den ersten Endpunkt suche, den Teilstring dann aber abschneide und im nächsten Schritt wieder nur den 1. Strichpunkt suche.
Es wird also die Suche per find() gegen das Kürzen des Strings getauscht. Zusätzlich fällt eine Zuweisung weg, da der Start immer bei 0 ist.
Die geänderte Auslastung wird in der 2. Grafik gezeigt.
Auch hier sind im roten Rahmen insgesamt 5 solcher Blöcke gezeigt.
[highlight=epc]
/* Parsen der einzelnen Fehler */; \\
if Data_Fehler1!=$$ then \\
/* Parsen von Fehler 1 */; \\
/* Parsen von WP_Fehler_1_Code */; \\
Name_StartPos=0u16; \\
Name_EndPos=find(Data_Fehler1,$;$,0u16)-1u16; \\
WP_Fehler_1_Code=split(Data_Fehler1,Name_StartPos, Name_EndPos); \\
Data_Fehler1=split(Data_Fehler1,Name_EndPos+2u16,E ND);\\
/* Parsen von Datum 1 */; \\
Name_EndPos=find(Data_Fehler1,$;$,0u16)-1u16; \\
Fehlertag=split(Data_Fehler1,Name_StartPos,Name_En dPos); \\
Data_Fehler1=split(Data_Fehler1,Name_EndPos+2u16,E ND); \\
Name_EndPos=find(Data_Fehler1,$;$,0u16)-1u16; \\
Fehlermonat=split(Data_Fehler1,Name_StartPos,Name_ EndPos); \\
Data_Fehler1=split(Data_Fehler1,Name_EndPos+2u16,E ND); \\
Name_EndPos=find(Data_Fehler1,$;$,0u16)-1u16; \\
Fehlerjahr=split(Data_Fehler1,Name_StartPos,Name_E ndPos); \\
Data_Fehler1=split(Data_Fehler1,Name_EndPos+2u16,E ND); \\
Jahresanpassung=convert(Fehlerjahr,0u16); \\
Jahresanpassung=2000u16+Jahresanpassung; \\
Fehlerjahr=convert(Jahresanpassung,$$); \\
WP_Fehler_1_Datum=Fehlertag+$.$+Fehlermonat+$.$+Fe hlerjahr; \\
/* Parsen von Uhrzeit 1 */; \\
Name_EndPos=find(Data_Fehler1,$;$,0u16)-1u16; \\
Fehlerstunde=split(Data_Fehler1,Name_StartPos,Name _EndPos); \\
Data_Fehler1=split(Data_Fehler1,Name_EndPos+2u16,E ND); \\
Name_EndPos=find(Data_Fehler1,$;$,0u16)-1u16; \\
Fehlerminute=split(Data_Fehler1,Name_StartPos,Name _EndPos); \\
Minutenanpassung=convert(Fehlerminute,0u16); \\
if Minutenanpassung<=9u16 then \\
Fehlerminute=$0$+Fehlerminute \\
endif; \\
WP_Fehler_1_Uhrzeit=Fehlerstunde+$:$+Fehlerminute; \\
endif;\\
[/highlight]
Der Unterschied scheint erheblich zu sein. Teilweise 250ms weniger pro Block.
Vermutlich hat das find() ein Problem. Könnt Ihr bei Ennertex prüfen, warum der 2. Code so viel schneller ist und ob hier tatsächlich das find() die Ursache ist?
Kommentar