AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi "Component is TButton" oder "Component.ClassName"
Thema durchsuchen
Ansicht
Themen-Optionen

"Component is TButton" oder "Component.ClassName"

Ein Thema von hoika · begonnen am 10. Dez 2019 · letzter Beitrag vom 15. Dez 2019
Antwort Antwort
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.045 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

AW: "Component is TButton" oder "Component.ClassName"

  Alt 10. Dez 2019, 14:36
Bei x is someclass fügt der Compiler einen Aufruf auf System._IsClass ein. Das ist nicht nur >10mal schneller als der ganze Kram, der in TObject.ClassName und dem String vergleich passiert, sondern - und das ist viel wichtiger - es liefert auch True zurück, wenn x eine Instanz einer von someclass abgeleiteten Klasse ist (hallo Polymorphie)

Fast schockierend, dass Delphientwickler immer noch denken, dass etwas, was eine Funktion beinhaltet, die einen string zurückliefert, mit dem etwas gemacht wird, irgendwie schneller sein könnte als ein bisschen Pointer vergleichen.

P.S.: Schneller als is wäre übrigens InheritsFrom wenn man auf den assigned Check verzichten kann - das spart nochmal einen Call
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (10. Dez 2019 um 14:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#2

AW: "Component is TButton" oder "Component.ClassName"

  Alt 15. Dez 2019, 13:37
Ihr dürft hier auch nicht RTTI mit RTTI verwechseln.

Die "alte" RTTI aka TypeInfo ist sehr einfach und schnell.
Die neuere "erweiterte" RTTI ist da schon komplexer und langsamer, da hier mit instanziieren Objekten/Interfaces gearbeitet wird, welches ein klein bissl Zeit braucht, für die Initialisierung und auch beim Multithreading muß man teilweise etwas aufpassen.

Seit 2009 ist die TypeInfo von ANSI auf UTF-8 umgestellt. Wo vorher nur ein String verglichen wurde, muß er nun erst nach Unicode (UCS2 UTF-16) umgewandelt werden.
Also vom Aufbau her ist die TypeInfo seit Jahrzehnten praktisch unverändert und damals, auf den uralten langsamen Rechnern, bis hin zu Zeiten des DOS, war die auch schon sehr sparsam und flott.

PS: Neben ClassType/ClassInfo und ClassName gibt es auch InheritsFrom und ClassNameIs.
InheritsFrom wie IS und ClassNameIs halt mit String statt ClassType.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (15. Dez 2019 um 13:40 Uhr)
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: "Component is TButton" oder "Component.ClassName"

  Alt 15. Dez 2019, 14:07
Die Aussage, dass es eine alte und eine neue RTTI gebe, ist schlicht Unsinn.
Das, was Du in der Unit "System.RTTI.pas" findest, ist eine handliche Kapseln der RTTI, die intern nach wie vor wild auf Pointern herumhampelt. Wirf einfach einen Blick in besagte Unit.
Viel anders geht es ja auch kaum, da die Basis, auf der die RTTI arbeitet, ja ein und dieselbe ist.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#4

AW: "Component is TButton" oder "Component.ClassName"

  Alt 15. Dez 2019, 14:32
OK, dann trennen wir es sprachlich eben mehr an den APIs, als an der inneren Speicherung auf.

Direkte Casts/Offsets/Zugriffe in TObject, der Typ TypeInfo bzw. Unit TypInfo und die Unit RTTI.

In der TypeInfo, bzw. den bereitgestellten APIs, hast halt nicht auf alles Zugriff. (bzw. nicht so einfach/verständlich)
Da wurde ja doch schon so Einiges in den letzten Jahrzehnten nachgerüstet und zusätzlich noch die Möglichkeit alle Infos zu enumerieren.
Aber dafür ist der Zugriff mit der alten API auf einzelne Infos direkter/einfacher. (nicht erst über den großen Context und dessen Interfaces die Einiges konvertieren und netter bereitstellen)

Schon bei den Attributen finde ich die ganze Sache mit den instanziirten Objekten bissl overdressed. (sonst ist dort ja auch alles auf einfachen Typen/Records/Arrays aufgebaut)
So wie sie alle nutzen, hätte da ein array[..] of record name: string; values: array of const; end vollkommen gereicht.
Nunja, nun wird da mit instanziirten Objekten gearbeitet und man kann im Constructor wunderschöne Dinde veranstalten.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz