Hilfe bei OOP - Seite 7

 
fxsaber #:

Falscher Vergleich, da er die Zeit für die automatische Entfernung von Objekten nicht berücksichtigt.

Geändert.

Woher die 123 Megabyte nach V3 kommen, weiß ich nicht.

Nein, das ist richtig. Und das ist eine grundsätzliche Frage. Die automatische Löschung erfolgt nicht im Haupt-Thread, wo die Zeitkosten extrem hoch sind. Sie können einen neuen Lauf starten, ohne darauf zu warten, dass der parallele Thread den verwendeten Speicher zurückgibt. Ja, sie wird auch aufgerufen und verbraucht ebenfalls CPU-Ressourcen, aber es handelt sich um einen Nebenvorgang, der im Hintergrund ausgeführt wird. Bei jeder Optimierung, selbst bei der aggressivsten, steht ein Teil der CPU-Ressourcen für andere Threads zur Verfügung, da alle modernen Betriebssysteme heutzutage auf diese Weise arbeiten. Eine 100%ige Auslastung der CPU ist bei modernen Prozessoren nahezu unmöglich.

--

Lassen Sie es mich anders formulieren. Angenommen, es gibt eine Aufgabe, die in 5 Zeiteinheiten auszuführen ist. Sie können ihn entweder mit einem Thread in 5 Einheiten oder mit zwei Threads in 3 bzw. 2 Einheiten ausführen. Die Gesamtausführungszeit wäre natürlich dieselbe: 5 Einheiten, aber die im zweiten Fall benötigte physische Zeit wäre um 2 Einheiten geringer, da die Aufgabe im zweiten Fall gleichzeitig ausgeführt wird und im ersten Fall nicht. Es gibt das Gegenargument, dass die Optimierung alle verfügbaren physischen Kerne der CPU beansprucht. Dies ist jedoch nicht der Fall. Bei jeder Optimierung wird bestenfalls eine Anzahl von Threads zugewiesen, die der Anzahl der Kerne des Betriebssystems entspricht. Zusätzlich zu diesen Aufgaben werden jedoch Hunderte von anderen Aufgaben im Betriebssystem ausgeführt, und alle 8 Kerne des Prozessors (wenn es acht davon gibt) werden auf Hunderte von Threads des Systems aufgeteilt, anstatt auf 8 Threads, die vom Optimierer zugewiesen werden. Die Zuweisung eines weiteren Threads im 8+1- oder 8+8-Modus ist also immer sinnvoller als die naive Annahme, dass eine Anwendung, sobald sie 8 Threads zugewiesen hat, alle CPU-Ressourcen zu 100 % nutzen wird.

--

Im Allgemeinen ist es amüsant, Argumente zu hören wie: "Nun, wir zählen diese Zeit nicht, weil sie in der Gesamtzeit des gesamten Systems enthalten ist."Oder das Argument, dass"Methoden von Objekten, die durch new erstellt wurden, langsamer aufgerufen werden" - Wenn dem so ist, sollten wir den Benchmark zu diesem Zeitpunkt wahrscheinlich außer Acht lassen, weil es unfair ist, wenn Methoden auf der einen Seite langsamer und auf der anderen Seite schneller aufgerufen werden)))))) Warum sollten wir dann so tun, als würden wir in der Leistung ertrinken? Seien wir doch mal ehrlich, wir stammen aus den 90er Jahren und lassen nichts als die falschen Slogans "Assembler ist sowieso schneller!" oder "Wenn ich mit Zeigern arbeite, habe ich alles unter Kontrolle" zu.

--

Zweiter Punkt. Achten Sie auf V2. Es gibt keine Objektlöschung und es gibt ein absichtliches direktes Speicherleck. Dennoch dauert die Zuweisung von Objekten 1,4 Sekunden gegenüber 1,2 Sekunden in V1, obwohl für das Löschen überhaupt keine Zeit aufgewendet wird.

fxsaber #:

Ich weiß nicht, woher die 123 MByte nach V3 kommen.

Das ist schwer zu sagen. Sie müssen die Spezifikation der virtuellen Maschine mql kennen. Aber niemand weiß das, außer den Entwicklern. Nach der Analyse in ProcessHacker zu urteilen, sieht es so aus, als ob die durch * new ausgewählten Objekte einzeln an einem Ort auf irgendeine komplizierte Weise zugewiesen und dann als große Arrays in einen anderen Speicherbereich verschoben werden. D.h. es könnte sich um einige temporäre Objekte oder etwas anderes handeln.

 
Vasiliy Sokolov #:

Nein, richtig. Und das ist eine grundsätzliche Frage. Die automatische Löschung erfolgt nicht im Haupt-Thread, wo die Zeitkosten extrem hoch sind. Sie können einen neuen Lauf starten, ohne darauf zu warten, dass der parallele Thread den verwendeten Speicher zurückgibt. Ja, sie wird auch aufgerufen und verbraucht ebenfalls CPU-Ressourcen, aber es handelt sich um einen Nebenvorgang, der im Hintergrund ausgeführt wird. Bei jeder Optimierung, selbst bei der aggressivsten, steht ein Teil der CPU-Ressourcen für andere Threads zur Verfügung, da alle modernen Betriebssysteme heutzutage auf diese Weise arbeiten. Eine 100%ige Auslastung der CPU ist bei modernen Prozessoren nahezu unmöglich.

--

Lassen Sie es mich anders formulieren. Angenommen, es gibt eine Aufgabe, die in 5 Zeiteinheiten auszuführen ist. Sie können ihn entweder mit einem Thread in 5 Einheiten oder mit zwei Threads in 3 bzw. 2 Einheiten ausführen. Die Gesamtausführungszeit wäre natürlich dieselbe: 5 Einheiten, aber die im zweiten Fall benötigte physische Zeit wäre um 2 Einheiten geringer, da die Aufgabe im zweiten Fall gleichzeitig ausgeführt wird und im ersten Fall nicht. Es gibt das Gegenargument, dass die Optimierung alle verfügbaren physischen Kerne der CPU beansprucht. Dies ist jedoch nicht der Fall. Bei jeder Optimierung wird bestenfalls eine Anzahl von Threads zugewiesen, die der Anzahl der Kerne des Betriebssystems entspricht. Zusätzlich zu diesen Aufgaben werden jedoch Hunderte von anderen Aufgaben im Betriebssystem ausgeführt, und alle 8 Kerne des Prozessors (wenn es acht davon gibt) werden auf Hunderte von Threads des Systems aufgeteilt, anstatt auf 8 Threads, die vom Optimierer zugewiesen werden. Die Zuweisung eines weiteren Threads im 8+1- oder 8+8-Modus ist also immer sinnvoller als die naive Annahme, dass eine Anwendung, sobald sie 8 Threads zugewiesen hat, alle CPU-Ressourcen zu 100 % nutzen wird.

--

Im Allgemeinen ist es amüsant, Argumente zu hören wie: "Nun, wir zählen diese Zeit nicht, weil sie in der Gesamtzeit des gesamten Systems enthalten ist."Oder das Argument, dass"Methoden von Objekten, die durch new erstellt wurden, langsamer aufgerufen werden" - Wenn dem so ist, sollten wir den Benchmark zu diesem Zeitpunkt wahrscheinlich außer Acht lassen, weil es unfair ist, wenn Methoden auf der einen Seite langsamer und auf der anderen Seite schneller aufgerufen werden)))))) Warum sollten wir dann so tun, als würden wir in der Leistung ertrinken? Seien wir doch mal ehrlich, wir stammen aus den 90er Jahren und lassen nichts als die falschen Slogans "Assembler ist sowieso schneller!" oder "Wenn ich mit Zeigern arbeite, habe ich alles unter Kontrolle" zu.

--

Zweiter Punkt. Achten Sie auf V2. Dort werden keine Objekte gelöscht und es wird absichtlich ein direktes Speicherleck verursacht. Selbst dann dauert die Zuweisung von Objekten 1,4 Sekunden gegenüber 1,2 Sekunden in V1, obwohl für das Löschen überhaupt keine Zeit aufgewendet wird.

Das ist schwer zu sagen. Sie müssen die Spezifikationen der virtuellen Maschine mql kennen. Und das weiß niemand außer den Entwicklern. Nach der Analyse in ProcessHacker zu urteilen, sieht es so aus, als ob die durch * new ausgewählten Objekte einzeln an einem Ort auf irgendeine komplizierte Weise zugewiesen und dann als große Arrays in einen anderen Speicherbereich verschoben werden. D.h. es könnte sich um einige temporäre Objekte oder etwas anderes handeln.


Wenn die Löschung also nicht im Hauptstrang erfolgt, was macht es dann für einen Unterschied, ob sie in die Messung einbezogen wird oder nicht? Es ist nicht so, als würde es)))) beeinflussen. Warum sollte man sie also nicht einbeziehen, um die Wahrheit zu sehen?

Und übrigens, Vasily, da wartet eine Frage auf dich (letzte Zeile).

 
Vasiliy Sokolov #:

... Oder das Argument, dass"Methoden von Objekten, die mit new erstellt wurden, langsamer aufgerufen werden"...

Haben Sie nicht den Mut, es zu messen? Du bist eine leere Hülle, Vasya, du Klapperschlange.

 
Dmitry Fedoseev #:

Haben Sie nicht den Mut, zu messen?

Schlafen Sie sich einfach aus!

 
Vasiliy Sokolov #:

Einfach ausschlafen!

Traum... und mit den Füßen stampfen...

 
Dmitry Fedoseev #:

Wenn die Löschung also nicht im Hauptthread erfolgt, welchen Unterschied macht es dann, ob sie in die Messung einbezogen wird oder nicht? Es ist ja nicht so, dass es Auswirkungen)))) Warum sollte man sie also nicht einbeziehen, um die Wahrheit zu sehen?

Dann beziehen Sie in den Benchmark die Gesamtzeit ein, die Explorer, Telegram und Chrome während der Optimierung verbrauchen. Selbst wenn Sie das alles abschalten und nur MT übrig lassen, wird es hundert andere System-Threads geben, die CPU-Zeit verschwenden, einschließlich dieser.

 
Vasiliy Sokolov #:

Dann beziehen Sie in den Benchmark die Gesamtzeit ein, die Explorer, Telegram und Chrome während der Optimierung verbrauchen. Selbst wenn Sie das alles abschalten und nur MT übrig lassen, wird es hundert andere System-Threads geben, die CPU-Zeit verschwenden, einschließlich dieser.

Es ist in parallelen Threads))) (© Vasya)

 

Vasya, du bist wirklich dumm!

Aber machen Sie weiter, bleiben Sie hartnäckig.

 
Dmitry Fedoseev #:

Übrigens, Wassili, da wartet eine Frage auf dich (letzte Zeile).

Sie können im Handumdrehen beweisen, dass Sie ein unbedarfter und unbedarfter Programmierer sind. Aber wer und warum sollte das nötig sein, wenn du es Jahr für Jahr beweist und buchstäblich jeden Thread in diesem Forum versaust. Ich habe zwei Jahre damit verbracht, hier nichts zu posten, nur gelegentlich nachgeschaut - und jedes Mal, in jedem Thread warst du, mit deiner "maßgeblichen Meinung" im Stil von "ihr seid alle Idioten, versteht nichts, und wie man es macht - werde ich nicht sagen. Du bist ein mieser Mensch, Dima.

 
Vasiliy Sokolov #:

Sie können im Handumdrehen beweisen, dass Sie ein Idiot und ein Null-Programmierer sind. Aber wer braucht das schon, wenn du es Jahr für Jahr beweist, indem du auf buchstäblich jeden Thread in diesem Forum scheißt. Ich habe zwei Jahre damit verbracht, hier nichts zu posten, nur gelegentlich nachgeschaut - und jedes Mal, in jedem Thread warst du, mit deiner "maßgeblichen Meinung" im Stil von "ihr seid alle Idioten, versteht nichts, und wie man es macht - werde ich nicht sagen. Du bist ein mieser Mensch, Dima.

Das Problem ist, dass ich dir nicht sage, wie du es richtig machen sollst.

Ja, und Sie haben hier schon etwas sehr gut bewiesen))

Und ich bin derjenige, der verdorben ist? Sie sind derjenige, der sowohl Durchfall als auch Skrofulose hat, wenn ich Code schreibe.