Fehler, Irrtümer, Fragen - Seite 2161
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Lassen Sie uns den gesamten Code sorgfältig prüfen. Es wäre interessant zu erfahren, was der wahre Grund dafür ist.
Super! Ich danke Ihnen! Ich bin auch daran interessiert.
Und sqrt ist in der Tat sehr schnell. Weniger als eine Nanosekunde :)). Fantastisch!
Ich habe es mit einem statischen Array versucht - dasselbe Ergebnis.
So schnell wie sqrt ist, fällt es mir schwer zu glauben, dass diese Funktion 10-mal schneller sein kann als das einfache Lesen eines Array-Elements.
An diesem Punkt funktionieren viele der alten Optimierungstechniken nicht mehr.
Außerdem, wenn in meinem Beispiel, um die Größe der Leinwand zu reduzieren, sagen wir 50x50 (für diese gibt es einen Eingabeparameter Größe, müssen Sie 50 anstelle von 0 zu setzen),
und das Array viel kleiner ist (5000 Elemente), ändert sich das Geschwindigkeitsbild erheblich. Es gibt keinen so starken Kontrast mehr.
Aber was ich nicht verstehe, ist, ob die Größe des Arrays die Geschwindigkeit des Zugriffs auf seine Elemente beeinflusst?
Es gibt keinen sauberen Beweis für Ihre Berechnungen, Sie machen Annahmen auf der Grundlage von sehr verunreinigtem Code.
Sie vernachlässigen eine ganze Reihe von Hilfsberechnungen, die in Ihrem Code enthalten sind und einen erheblichen Einfluss auf die Ergebnisse haben.
Es gibt keinen sauberen Beweis für Ihre Berechnungen, Sie machen Annahmen, die auf einem sehr verkorksten Code basieren.
Sie vernachlässigen eine ganze Reihe von Hilfsberechnungen, die in Ihrem Code enthalten sind und einen erheblichen Einfluss auf die Ergebnisse haben.
Alles, was ich sehen kann, ist, dass allein durch die Änderung von sqrt auf ein einfaches Lesen aus einem Array, die Gesamtberechnungsgeschwindigkeit um den Faktor 4 sinkt. Und der Gesamtanteil von sqrt an dieser recht umfangreichen Berechnung jedes Pixels beträgt kaum mehr als 10 % oder sogar nur ein paar %.
Eine klare Anomalie!
Ich habe sogar den Fehler gemacht, zu sagen, dass die Zugriffszeit auf ein Array-Element das 10-fache der sqrt-Zeit ist. Viel mehr, da sqrt so schnell ist und die allgemeine Verlangsamung so groß ist.
Ich kann nur feststellen, dass durch die einfache Änderung von sqrt in ein einfaches Lesen aus einem Array die Gesamtberechnungsgeschwindigkeit um den Faktor 4 sinkt. Und der Gesamtanteil von sqrt an dieser recht umfangreichen Berechnung jedes Pixels beträgt kaum mehr als 10 % oder sogar nur ein paar %.
Eine klare Anomalie!
Ich habe erklärt, warum. Die Optimierungen der Mathematik der neunziger Jahre funktionieren nicht mehr.
Aber Sie stellen immer wieder die folgenden Behauptungen auf der Grundlage von realem, verschmutztem Code auf. In Bezug auf die Pflanzen sind sie falsch.
Auf dieser Ebene der technischen [Un]reinheit werde ich nicht auf die Fragen eingehen.
Ich habe erklärt, warum. Die Optimierungen der Mathematik aus den neunziger Jahren funktionieren nicht mehr.
Aber Sie stellen immer wieder die folgenden Behauptungen auf der Grundlage von wirklich verunreinigtem Code auf. Plausibel fehlerhaft.
Auf dieser Ebene der technischen [Un]reinheit werde ich nicht auf die Fragen eingehen.
Ich verstehe nicht, von welcher mathematischen Optimierung Sie sprechen. Und ich habe keine Behauptungen aufgestellt, sondern mich nur gefragt, woher die Bremsen kommen.
Wo ist das Durcheinander und die Optimierung in diesem ursprünglichen Code?
Sie können diesen allgemeineren Code verwenden, aber dank der Verwendung von Schleifen und Arrays wird die Geschwindigkeit des Bildaufbaus fast halbiert:
Optimierung der Mathematik: Versuch der Verwendung von Arrays anstelle von sqrt.
Sie sehen das Durcheinander nicht, und das ist die Ursache für Ihr Missverständnis der Regeln für Leistungstests. Wenn Sie ein vorberechnetes Array gegen eine Berechnung testen, müssen Sie alles Überflüssige entfernen. Alles absolut unnötig.
Sie haben eine Reihe von Behauptungen aufgestellt. Sie müssen in der Lage sein, die Texte von der Empfängerseite her zu lesen und sie von den nicht funktionierenden Abwehrmechanismen des Autors zu befreien.
Optimierung der Mathematik: Versuch der Verwendung von Arrays anstelle von sqrt.
Ach, zum Teufel mit sqrt. Ich habe bereits festgestellt, dass dies im Falle dieser speziellen Funktion keinen Sinn macht. Was ist falsch daran, es zu versuchen? Aber jetzt weiß ich es.
Übrigens bringt die Verwendung des h[]-Arrays in diesem Beispiel auch einen erheblichen Geschwindigkeitsgewinn gegenüber der Verwendung von sin().
Die Frage bezieht sich auf etwas anderes:
Warum erhöht sich die Rechenzeit durch den Zugriff auf die Zellen eines großen Arrays um ein Vielfaches, obwohl nur ein paar Prozent erwartet wurden?
Sie sehen den Wurf nicht, und das ist die Ursache für Ihr Missverständnis der Regeln für Leistungstests.Wenn Sie ein vorberechnetes Array gegen eine Berechnung testen, müssen Sie alles Überflüssige entfernen. Alles absolut unnötig.
Weißt du, Renat, es ist keine Schande, von dir eine Ohrfeige zu bekommen, sondern sogar eine Ehre.
Nach meinem Verständnis ist Müll etwas Unnötiges, das entfernt werden kann und sollte. Aber in diesem speziellen Fall gibt es nichts zu bereinigen, sonst würde der Code nicht mehr funktionieren.
Ich teste nicht"vorberechnetes Array vs. Berechnung", sondern analysiere die Geschwindigkeit der Rahmenbildung.
In meinem Fall brauche ich keine Tests, denn ich habe einen schwachen Laptop und kann den Unterschied zwischen 25 fps und 6 fps ohne Tests erkennen.
Die Behauptungen, die Sie aufgestellt haben, sind massiv. Sie müssen in der Lage sein, die Texte von der Empfängerseite her zu lesen und sie von den nicht funktionierenden Abwehrmechanismen des Autors zu befreien.
Ich habe nur ein paar Annahmen gemacht, keine Behauptungen:
- "Es ist logisch anzunehmen, dass das Lesen aus dem Array SQRT[x] schneller ist als die Funktion sqrt(x)."
-Man könnte annehmen, dass der Compiler auf eine seltsame Weise auf ein großes Array zugreift, und bei jeder Schleifenumdrehung scheint er das Array zu "vergessen" und jedes Mal eine Art von Dienstindexierung vorzunehmen. "
Aber ich wage diese Aussage trotzdem, weil ich zwar ein autodidaktischer Programmierer bin, aber ein Autodidakt mit großer Erfahrung und etwas Verständnis für die Vorgänge im Prozessor, denn es gab eine Zeit, in der mein Lieblingsprogramm Numega SoftIce war, mit dem ich mich durch Tonnen von fremdem Code auf Assembler-Ebene gegraben habe.
- Ich versichere Ihnen, dass es einen algorithmischen Fehler in Ihrem Compiler gibt, der den Zugriff auf Arrays betrifft (vielleicht taucht er nur bei ausreichend großen Arrays auf), den Ihr Team leicht finden wird, wenn Sie einen Vektor der Bemühungen in diese Richtung setzen. Und mein Beispiel wird Ihnen helfen.
Ich könnte sogar argumentieren. ))
Wenn Sie eine Tabelle in einer Schleife durchlaufen, befindet sie sich bei jedem nächsten Zugriff wahrscheinlich im Cache des Prozessors. Aus diesem Grund läuft es schneller.
Liegt zwischen den Zugriffen ein beliebiger Code, so liegt wahrscheinlich ein Cache-Miss vor. Dies erklärt auch den Unterschied in der Handhabung eines großen und eines kleinen Tisches.
Außerdem gibt es andere, nicht offensichtliche Fälle. Daher ist es notwendig, die endgültige, nicht vereinfachte Version des Codes zu testen.
Leute, sagt mir, wie man in den Funktionsvorlagen feststellt, dass die Funktion mit dem Typ enum aufgerufen wird?