![]() |
Hohe CPU Auslastung bei 64Bit Anwendungen
Ich versuche es noch einmal ohne über den Compiler zu schimpfen. :)
Die Ausgangssituation ist diese das die gleiche Anwendung gleicher Quelltext unter 32Bit 0% und mit 64Bit 25% Cpu Auslastung produziert. Bei 32Bit könnt ihr die Geschwindigkeit auf Maximum stellen und es bleibt bei fast 0% Auslastung wenn die Durchsichtigkeit ausgeschaltet ist. Was ich versucht habe. Zitat:
Die Anwendung zum testen das es so ist ![]() Es tritt nur dann auf wenn diese Funktion aufgerufen wird.
Delphi-Quellcode:
Das kann man leicht testen indem man einfach die "eigene Rotation und die 3D tiefe ausschaltet" beide Eigenschaften verwenden im etwas abgeänderte form die gleiche Funktion.
if (ObjItem.angle <> 0) then
begin GdipSetInterpolationMode(graphics, ObjItem.quality); GdipRotateWorldTransform(graphics, ObjItem.angle + 180, MatrixOrderAppend); //<<<< hier GdipTranslateWorldTransform(graphics, xD + (wD div 2), yD + (hD div 2), MatrixOrderAppend); //<<<<< und hier GdipDrawImageRectRectI(graphics, img, wD div 2, hD div 2, -wD, -hD, xS, yS, wS, hS, 2, imgAttr, ImgAbort, nil); end else begin GdipSetInterpolationMode(graphics, ObjItem.quality); GdipDrawImageRectRectI(graphics, img, PosX, PosY, wD, hD, xS, yS, wS, hS, 2, imgAttr, ImgAbort, nil); end; Meine Vermutung ist das dieses Problem von der GDIPlus 64Bit selbst verursacht wird oder aber wie zuvor schon öfters eine der Typen nicht korrekt für 64Bit definiert ist. Vielleicht hat ja doch noch jemand eine Idee falls es an der Anwendung selbst liegt. Bei der DLL werde ich es dann wohl selbst finden müssen obwohl ich nicht erkennen kann das es hier ein Type Problem geben könnte. (Etwas fehlt mir auch die Erfahrung ;) ) Hier noch dir Funktionen
Delphi-Quellcode:
Die übergebenen Typen sind alle identisch..
GdipTranslateWorldTransform: function(Graphics: LONG_PTR; dx: Single; dy: Single; order: GpMatrixOrder): GPSTATUS; stdcall;
GdipRotateWorldTransform: function(Graphics: LONG_PTR; angle: Single; order: GpMatrixOrder): GPSTATUS; stdcall; Habe es auch schon mit Pointer versucht bringt keine Verbesserung. gruss |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Hat sich erledigt.
Jemand hat sich bereit erklärt das Problem zu analysieren. (Wenn es jemand kann dann er ;) ) Bei ihm ist die Auslastung 32Bit vs. 64Bit die gleiche so um 0 > 3 Prozent. (Win10) Es scheint so das es nicht an Delphi (Compiler) sondern an meiner älteren Hardware liegt. Das Problem ist bei mir unter 32Bit nie aufgetreten, warum es mit der 64Bit Version nicht geht, nun da bin ich nicht der Spezialist um das zu analysieren. Es scheint tiefer zu gehen als der Code selbst. Von daher denke ich das ich es so hinnehmen muss wie es ist. Programmtechnisch gesehen kann ich auf die angesprochenen Funktionen die in GDIPlus verwendet werden keinen Einfluss nehmen. GDIPlus64 <> GDIPlus32 PS: Zumindest kann ich davon ausgehen das es nicht an meiner Programmierung oder den 64Bit Compiler von Delphi liegt. ;) gruss |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Schön das es geklärt ist,
hatte es gerade compilert und wollte da mal reinschauen. Kann ich es mir sparen... ;-) |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Zitat:
Trotzdem Danke. gruss |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Jetzt ist es wohl klar........
Aber nur zur Info: Auf meinem Rechner pendeln beide Versionen zwischen 0 und 1 % |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Zitat:
Denke Win10 oder? Bei mir auf dem Rechner Win7 wie schon gesagt 64Bit 25% andere 0. Meine CPU Core2 Quad Q9650 3GHZ. gruss |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Grafikkarte:
NVidia QUADRO P600 Intel Core i7-8700K 3.7 Ghz 64 GB Ram Windows 10 ja |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Zitat:
Meine Graka NVidia GTX 780 TI Danke nochmals. gruss |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Sorry eins wollte ich noch nachfragen.
Wenn du das teil mit voller Leistung laufen lässt wie ist die CPU Auslastung dann? Also alles an inklusive Speed auf Maximum. Nebenbei bei mir auf Win10 externe Festplatte über USB 2 85% CPU Auslastung. :) Bis mein System vollständig gestartet ist benötige ich etwa 10 Min. gruss |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Tja, pendelt bei beiden Version zwischen 3 und 4%
Das hast Du echt gut gemacht. Wobei mein Rechner ja eher am oberen Rand anzusiedeln ist. Arbeite halt im CAD Bereich und da ist Speed alles..... |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Zitat:
Zitat:
gruss |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Zitat:
z.B. AQTime :zwinker: Erstmal schauen wo überhaupt die meiste Zeit anfällt. Aber wie bereits schon jamand sagte, kann man auch schauen ob z.B. irgendwo "zu oft" gezeichnet wird, also ob man schon an der Anzahl der Ausführungen etwas sparen kann, bevor man schaut die einzelnen Zeichendurchläufe zu optimieren. (z.B. 300000 FPS sind mehr als genug, als überhaupt jemand das alles sehen könnte) |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Zitat:
Er wird mir aber dabei auch nicht helfen denn wie schon analysiert liegt es an meiner Hardware und wo bzw. wodurch das Problem auftritt weis ich ja. Der Profiler kann mir also nur sagen was ich am ende schon weis. gruss |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Zitat:
![]() |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Zitat:
Zitat:
Das kann ich nicht machen! :) gruss |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Es gibt auch andere Profiler, nicht nur AQTime.
Und von XE bis XE7 war eine kostenlose Edition des AQTime im Delphi enthalten, welche keine Daten haben wollte. |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Zitat:
Es liegt definitiv nicht am "Timer, Compiler, Delphi, Code" sondern an meiner Hardware. gruss |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Ein Profiler kann dir zeigen wo im Programm die meiste Zeit für alle Berechnungen anfallen, also wer an den 100% CPU-Last die meiste Schuld hat.
Das geht bei AQTime auf ganze Prozeduren, bis hin zu einzelnen Delphi-Befehlen und vielleicht sogar auf Assembler-Ebene. (je tiefer die Ebene, um so größer die Beeinflussung der Messung > kannst selber ausprobieren, wenn du manuell eine Zeitmessung einbaust und z.B. in einem
Delphi-Quellcode:
die Dauer der einzelnen INC misst und zusammenrechnest und das dann mit "nur" einer einzelnen Messung um die ganze Schleife vergleichst)
for i := 0 to 10000000 do Inc(x);
Natürlich erzeugen Compiler für verschiedene Systeme unterschiedlichen Code. (egal ob Win32, Win64, iOS, MacOX, Linux usw.) Da gibt es sogar nochmal einen Unterschied, ob du ein 32 Bit-Programm in einer 32-Bit-CPU laufen lässt oder in einer 64-Bit-CPU/64-Bit-Windows, bzw. 32-Bit-Anwendung in einem 32-Bit-Windows auf einer 64-Bit-CPU und das dann noch gegen den 64-Bit-Code in der 64-Bit-CPU/Windows. Es gibt auch im Pascal/RTL/VCL/... nochmal unterschiedliche Versionen je Plattform vom mehreren Funktionen, vor allem bei Codes wo direkt mit Assembler gearbeitet wird. Daran kannst du nichts ändern (unabhängig davon, dass andere/neuere Win32-Compiler anderen Code und bessere Optimierungen bieten und dass man für einzelne Delphi-Funktionen eigene/fremde Versionen nutzen kann) aber du kannst schauen wo die Zeit/CPULast anfällt und da dann eventuell deinen Quellcode anpassen. Bedenke dass Win64 so ähnlich wie iOS, Linux und Co. angesehen werden muß und nicht jeder Code einfach so überall gleich verwendet werden kann. Bei einfachen Funktionen geht das schon, sobald System-APIs ins Spiel kommen, kann es die düben nicht/anders geben, und insgesamt muß man eben für unterschiedliche Systeme auch eigenen/angepassten Code erstellen. |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Zitat:
Aber noch einmal das weis ich auch ohne Profiler. Es sind diese beiden Funktionen und da habe ich keinen Einfluss drauf unabhängig davon wie viele Frames ich Rendern kann\könnte. Wenn meine Hardware mit diesen Funktionen Probleme hat kann ich nichts dran ändern. Da es unter 32BIT läuft kann es nur daran liegen das sich die GDIPlus64 mit meiner Hardware nicht verträgt.
Delphi-Quellcode:
GdipTranslateWorldTransform: function(Graphics: LONG_PTR; dx: Single; dy: Single; order: GpMatrixOrder): GPSTATUS; stdcall;
GdipRotateWorldTransform: function(Graphics: LONG_PTR; angle: Single; order: GpMatrixOrder): GPSTATUS; stdcall; Zitat:
gruss |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Hmmm, OK, da kann natürlich erstmal der Code der GDI+ DLLs sich unterscheiden (die für 64 Bit könnten einfach nur grottenschlecht sein)
dann natürlich noch dein Grafiktreiber usw. Aber es kann auch sein, dass du im GDI+ irgendwo ein paar Einstellungen anders machen mußt, damit es schneller/sparsamer läuft. Oder dass du unter 64 Bit mit einer anderen API oder anderen/neueren Funktionen jener API bessere Ergebnisse erzielst. Für so manche Funktionen haben oftmals auch andere Entwickler "bessere" Funktionen gebaut, als die im Betriebssystem vorhandenen. |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Zitat:
Zitat:
Zitat:
Zitat:
Aber ich verwende beabsichtigt einen alten Treiber( 352.86 ) weil die Nachfolgenden von NVIDIA wirklich Grotten schlecht sind. Das ist der einzige der bei mir bisher noch keinen Absturz oder gar Blue-Screen verursacht hat. gruss |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Nebenbei eine Sinnvolle Verwendung wäre zum Beispiel so etwas.
Diamanten mit Thumbnails der eigenen Anwendung ersetzen Array anpassen sowie eine neue Brennweite(FocalLength) festlegen das war es dann schon. Beim Klick auf eines der Thumbnails den jeweiligen Skin auswählen. Hier als Beispiel mein Mediaplayer. gruss |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Zitat:
|
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Zitat:
Das benötigt bis zum Start, vollständiger Desktop geladen zirka 10 Min.. Da ist nix mit Boost selbst wenn ich es wollte. 85% Auslastung sagt wohl alles. Windows 10 ist nur ein Developer Test System.. Als Standard System werde ich es nie verwenden. Von daher egal! gruss |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Ich hatte das mit Usb 2 gelesen, aber erst jetzt bei Wiederholung richtig verstanden.
Beim erstem mal Lesen hab ich mich erschrocken und dachte "er meint das bestimmt anders" 40MB/s Limit, das ist natürlich ärgerlich, aber wie Du erwähntest, auch egal da Win7 im Vordergrund steht. |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Zitat:
gruss |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
![]() |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Zitat:
Das WHQL besagt gar nichts ist halt nur verifiziert und hat nichts mit Qualität zu tun. Das Problem ist halt bei NVIDIA, diese optimieren ihre Treiber für Spiele und vernachlässigen das System damit kann ich nichts anfangen. ![]() Und der neueste ist nicht gleich der beste! Und angeblich stabile Versionen haben mein System schon öfters abstürzen lassen als mir lieb ist. Wie gesagt.. was ich mir wünsche wäre ein System Ready nicht einen "Game Ready" Treiber den gibt es aber leider nicht. PS: Macht auch keinen sinn jetzt weiter über Treiber zu philosophieren das Thema ist eigentlich schon durch. ;) Destotrotz habe den Treiber von dir getestet wie erwartet nach ca. 5 Stunden der erste schwarze Bildschirm danach war mein Video das ich gerade angeschaut habe nur noch ein grüner Bildschirm. Und wieder den alten zuverlässigen drauf. gruss |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Zitat:
Tja, und nun nochmal das Gleiche für 64 Bit. :stupid: |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Zitat:
Du verstehst es nur nicht das ich nichts weiter tun kann, es ist Hardware bedingt. Frage @Zacherl und ja er weis bestimmt was er tut. Er hat zwar meinen Quelltext nicht studiert aber er wird dir zumindest sagen können das da, im Moment zumindest, nichts weiter optimiert werden kann. Und bei ihm schwanken beide Plattformen etwa bei 0 - 1%. gruss |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Zumindest davon ausgehend, dass wirklich die zwei GDIP Aufrufe für die hohe Auslastung sorgen (was ich bei mir nicht 100%ig verifizieren konnte, da das Problem bei mir nicht auftritt), kann es nur noch ein implementationstechnisches Problem der GDI+ Schnittstelle sein. Hier springt der Code ja in die entsprechende Dll, auf die man nun wirklich keinen Einfluss mehr hat.
Meine Vermutung war, dass für die 64-Bit Version eventuell neuere CPU Instructions (AVX, etc.) zur Optimierung verwendet werden und für Systeme ohne diese Instructions lediglich ein primitiver und imperformanter Fallback implementiert wurde. Ist natürlich reine Spekulation, aber scheinbar tritt das Problem ja wirklich nur hardwarespezifisch bei Emil auf dessen CPU beispielsweise tatsächlich kein AVX und co. unterstüzt. |
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
GDI+ stammt noch aus XP-Zeiten, die 64Bit Portierung muss also erst viel später gekommen sein. Durchaus möglich, dass da etwas geschlampt wurde. Besonders ärgerlich: Im Gegensatz zu GDI, ist GDI+ auf Win7 nur Softwareseitig implementiert. Das machts natürlich um so ärgerlicher.
|
AW: Hohe CPU Auslastung bei 64Bit Anwendungen
Zitat:
Aber selbst wenn das ein Problem sein sollte was ich bezweifeln möchte müssten die gleichen Probleme dann auch unter 32Bit auftreten. Denn auch hier wird sie Dynamisch geladen. Ich habe die Typen Graphics und Image als LONG_PTR definiert weil meine Properties in einem vordefiniert Speicherbereich der Winproc geschrieben und gelesen werden.. siehe Zitat:
Die Größe des Speicherbereich ist dann abhängig von 64 btw. 32Bit. Deshalb *SizeOf(LONG_PTR) Die Propertys werden dann mit SetWindowLongPtr geschrieben und GetWindowLongPtr gelesen. Also es ist schon optimiert. Man kann es drehen wie man will da ist leider nichts zu machen. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 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