von Noch so einer » Mi 10. Apr 2013, 15:51
Die Suche findet jedes Mal statt, egal ob es bereits ein Control Sequence mit dem Namen gibt oder nicht. Wichtiger ist die Frage, ob in der Hash-Tabelle von TeX ein Eintrag vorgenommen wird. Hash-Einträge werden nämlich nicht mehr frei gegeben, auch wenn die zugehörige Control Sequence nicht mehr definiert ist, weil die zugehörige Gruppe beendet wurde. Und wie alle Speicher ist auch hash_memory bei TeX ein statischer Speicher. Im string_memory (Teil von pool_memory) wird der Name der Control Sequence AFAIR sogar gelöscht und der Speicher steht dann wieder zur Verfügung. Bei der Hash-Tabelle geht das aber nicht. Deshalb belegen Control Sequences, die mit \csname…\endcsname irgendwann einmal zu \relax wurden auch dann noch einen Eintrag, wenn sie wieder undefiniert sind. Bei der e-TeX-Anweisungen \ifcsname wurde aber genau das verhindert, indem die Control Sequence gar nicht erst als \relax definiert wird.
Wer nun glaubt, dass die KOMA-Script-Implementierung da nichts nützt, weil sie ja auch noch einen Test enthält, der mit \csname…\endcsname arbeitet, der irrt. Dieser Test wird nämlich nur ausgeführt, wenn die Control Sequence nicht undefiniert ist, also bereits min. als \relax definiert wurde.
Alles ein wenig kompliziert. Achja: Dass das Eintragen in der Hash-Tabelle Zeit kostet, ist natürlich richtig. Ggf. kostet außerdem die Implizite Definition als \relax durch \csname…\endcsname Zeit. Einen Unterschied merkt man hier dann natürlich nur für Anweisungen, die aus TeX-Sicht undefiniert sind. Für Anweisungen, die aus TeX-Sicht definiert, aus LaTeX-Sicht aber undefiniert sind, also Anweisungen, die \relax sind, ergibt sich kein Gewinn, sondern eher ein geringer Zeitverlust.
Die Suche findet jedes Mal statt, egal ob es bereits ein Control Sequence mit dem Namen gibt oder nicht. Wichtiger ist die Frage, ob in der Hash-Tabelle von TeX ein Eintrag vorgenommen wird. Hash-Einträge werden nämlich nicht mehr frei gegeben, auch wenn die zugehörige Control Sequence nicht mehr definiert ist, weil die zugehörige Gruppe beendet wurde. Und wie alle Speicher ist auch hash_memory bei TeX ein statischer Speicher. Im string_memory (Teil von pool_memory) wird der Name der Control Sequence AFAIR sogar gelöscht und der Speicher steht dann wieder zur Verfügung. Bei der Hash-Tabelle geht das aber nicht. Deshalb belegen Control Sequences, die mit \csname…\endcsname irgendwann einmal zu \relax wurden auch dann noch einen Eintrag, wenn sie wieder undefiniert sind. Bei der e-TeX-Anweisungen \ifcsname wurde aber genau das verhindert, indem die Control Sequence gar nicht erst als \relax definiert wird.
Wer nun glaubt, dass die KOMA-Script-Implementierung da nichts nützt, weil sie ja auch noch einen Test enthält, der mit \csname…\endcsname arbeitet, der irrt. Dieser Test wird nämlich nur ausgeführt, wenn die Control Sequence nicht undefiniert ist, also bereits min. als \relax definiert wurde.
Alles ein wenig kompliziert. Achja: Dass das Eintragen in der Hash-Tabelle Zeit kostet, ist natürlich richtig. Ggf. kostet außerdem die Implizite Definition als \relax durch \csname…\endcsname Zeit. Einen Unterschied merkt man hier dann natürlich nur für Anweisungen, die aus TeX-Sicht undefiniert sind. Für Anweisungen, die aus TeX-Sicht definiert, aus LaTeX-Sicht aber undefiniert sind, also Anweisungen, die \relax sind, ergibt sich kein Gewinn, sondern eher ein geringer Zeitverlust.