AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign EnsureRange vs. Min( 0, Max( 1, Value )) unter CrossPlatform
Thema durchsuchen
Ansicht
Themen-Optionen

EnsureRange vs. Min( 0, Max( 1, Value )) unter CrossPlatform

Ein Thema von Rollo62 · begonnen am 2. Sep 2022 · letzter Beitrag vom 5. Sep 2022
Antwort Antwort
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#1

EnsureRange vs. Min( 0, Max( 1, Value )) unter CrossPlatform

  Alt 2. Sep 2022, 08:01
Hallo zusammen,

ich möchte eine Zahl in einem Bereich begrenzen und dafür gibt es ja EnsureRange:
Delphi-Quellcode:
function EnsureRange( const AValue, AMin, AMax : Single ) : Single;

function EnsureRange(const AValue, AMin, AMax: Single): Single;
begin
  assert(AMin <= AMax);
  if AValue < AMin then
    Result := AMin
  else if AValue > AMax then
    Result := AMax
  else
    Result := AValue;
end;
Die ist aber nicht inline und hat noch den assert
Wobei die Funktionen Min/Max inline sind und auf den assert verzichten.

Delphi-Quellcode:
function Min(const A, B: Single): Single; overload; inline;

function Min(const A, B: Single): Single;
begin
  if A < B then
    Result := A
  else
    Result := B;
end;
Ich frage mich welche Version performanter ist, wenn ich auf einen assert verzichten kann und das auch auf allen Platformen benutzen möchte:

Delphi-Quellcode:
    Result := EnsureRange( 0.0, 1.0, AValue );
    // oder
    Result := Min( 0.0, Max( 1.0, AValue ) );
Es sollte eigentlich EnsureRange sein, ich bin mir da aber nicht sicher wie und ob die verschiedenen Compiler das optimieren.
Vielleicht hat da jemand einen Hinweis für mich ?
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.456 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: EnsureRange vs. Min( 0, Max( 1, Value )) unter CrossPlatform

  Alt 2. Sep 2022, 08:09
Eine inline ist generell performanter. Aber spielt das wirklich eine Rolle?
https://clean-code-developer.de/die-...e_Optimization
Wenn dann würde ich eine inline Variante von EnsureRange machen.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#3

AW: EnsureRange vs. Min( 0, Max( 1, Value )) unter CrossPlatform

  Alt 2. Sep 2022, 09:15
Eine inline ist generell performanter. Aber spielt das wirklich eine Rolle?
Ich würde das in dem Fall jetzt nicht nicht "Überoptimierung" nenne, denn wenn EnsureRange sehr oft und an vielen Stellen aufgerufen wird ist es doch der erste Kandidat für ein Profiling Problem.
Ich frage ja nur ob vielleicht shcon jemand Beides verglichen hat.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.456 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: EnsureRange vs. Min( 0, Max( 1, Value )) unter CrossPlatform

  Alt 2. Sep 2022, 13:51
Ich vermute eher Nein. EnsureRange habe ich auch erst durch Dich kennengelernt.
Was meinst Du mit Profiling Problem? Ich habe eines, weil ich mit dem Profiler AQTime nicht umgehen kann

Um was geht es Dir? Was ist der Hintergrund? Ist eine konkrete Funktion einem Anwender zu langsam? Geht es um eine akademische Betrachtung der Geschwindigkeit der Varianten?
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#5

AW: EnsureRange vs. Min( 0, Max( 1, Value )) unter CrossPlatform

  Alt 2. Sep 2022, 18:14
Ich möchte einen wahlfreien Zugriff von aussen möglichst absichern in dem der Zugriff auf das Min und Max limitiert wird.
Ansonsten müsste ich jeden Zugriff von aussen der Klasse absichern, was ich nicht möchte.
Der Zugriff kann von mehreren Stellen erfolgen und in dem Fall das Array kann schon ein paar Werte enthalten.
Normalerweise würde ich solche Abfragen vor einer Scheife machen und dann "unsafe" zugreifen, aber hier können verschiedene Stellen auch teilweise über das Array erfolgen.
Deshalb suche ich nach der Besten Clamping Methode um das "safe" zu machen.
Die Performance ist noch moderat, aber es geht um ImageProcessing und da wäre ich gerne auf der sicheren Seite.
Profiling habe ich hier nicht eingerichtet, auch weil es um CrossPlatform geht.
Wäre schön wenn es da was einfaches gäbe, hab's aber bislang nicht gefunden.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.456 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: EnsureRange vs. Min( 0, Max( 1, Value )) unter CrossPlatform

  Alt 3. Sep 2022, 11:33
Einfaches Profiling? Habe ich auch noch nicht gefunden.

Das was Du schreibst trifft nicht ganz meine Frage. Aber ImageProcessing sagt mir was.
Also mein Vorschlag: Mach doch eine eigene "EnsureRange". Nimm die von oben, mach den "assert" weg und den "inline" dazu. Fertig.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: EnsureRange vs. Min( 0, Max( 1, Value )) unter CrossPlatform

  Alt 5. Sep 2022, 12:38
Die RTL wird ohne Assertions kompiliert, das siehst du übrigens, wenn du mal in EnsureRange reindebuggst.

Übrigens, du hast oben EnsureRange( 0.0, 1.0, AValue ); geschrieben, aber ich gehe davon aus, dass du EnsureRange( AValue, 0.0, 1.0 ); meintest

wenn EnsureRange sehr oft und an vielen Stellen aufgerufen wird ist es doch der erste Kandidat für ein Profiling Problem.
Kaum, außer du rufst EnsureRange laufend in Schleifen auf.

Ansonsten Regel Nummer 1 - Anwendung durch nen Profiler jagen (und damit meine ich einen SamplingProfiler - und keinen Instrumentation Profiler wie AQTime), um eine grobe Idee zu bekommen, was wirklich die Zeit verbraucht.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie ( 5. Sep 2022 um 12:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: EnsureRange vs. Min( 0, Max( 1, Value )) unter CrossPlatform

  Alt 5. Sep 2022, 14:39
Wer viel Misst misst Mist.

Hatte es schon, dass in einer Schleife ganz viel Zeit angezeigt wurde, aber die Zeit kam vom AQTime (mit Profiler war es auch insgesamt viel langsamer)
Nach dem Umbau fiel dann auf, dass Dort die gesamte Schleife eigentlich garnicht so langsam war, auch wenn in der Schleife etwas einige Millionen Male gemacht wurde.


Es ist schon eine Kunst die Resultate auch richtig auszuwerten.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: EnsureRange vs. Min( 0, Max( 1, Value )) unter CrossPlatform

  Alt 5. Sep 2022, 14:52
Es ist schon eine Kunst die Resultate auch richtig auszuwerten.
Nein, die "Kunst" ist es, zu wissen, wie AQTime bzw ein sogenannter Instrumentation Profiler funktioniert

Bei absolut fein granularem Profiling ist Instrumentierung einfach nicht zu gebrauchen, da der Overhead bzw die Laufzeitveränderung durch diese das Ergebnis verfälscht.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#10

AW: EnsureRange vs. Min( 0, Max( 1, Value )) unter CrossPlatform

  Alt 5. Sep 2022, 18:56
Ok, ich werde im Moment bei EnsureRange bleiben, ist nicht so kritisch.
Der Hinweis zu dem Assertions ist sehr interessant, werde ich mir merken

Ansonsten Regel Nummer 1 - Anwendung durch nen Profiler jagen (und damit meine ich einen SamplingProfiler - und keinen Instrumentation Profiler wie AQTime), um eine grobe Idee zu bekommen, was wirklich die Zeit verbraucht.
Das würde ich auch gerne machen, aber die gibt es ja nur für Windows(32).
Mir geht es auch darum ob es sich auf allen Plattformen dann ähnlich verhält, weil das ja ganz unterschiedliche Compiler und Systeme sind.
Soweit ich weiss gibt es keinen CrossPlatform-Profiler, oder etwa doch ?
  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 04:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz