Langsamer Code

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8677
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Langsamer Code

Beitrag von NicTheQuick »

STARGÅTE hat geschrieben:>> "Genauso diese kleinen unnötigen Dinge wie Proceduren am Ende, wäre keine grosse Sache dies mit einem einfachen Skript zu beheben."
Was meinst du damit?
Er fragt sich, warum man Procedures im Voraus deklarieren muss. Antwort: Das liegt auch daran, dass es ein Single-Pass-Compiler ist. Aber es gibt IDE-Tools, die für dich alles im Voraus deklarieren bevor es zum Compiler geschickt wird.

@Peti:
Bezüglich Bild-Dekoder hat STARGÅTE eigentlich schon alles gesagt, aber ich möchte trotzdem nochmal einhaken. Dateiendungen sind Schall und Rauch. Windows ist das einzige Betriebssystem, das da so viel Wert drauf legt. Unter Linux werden Dateitypen z.B. immer nach ihrem Inhalt beurteilt und nicht nach ihrer Endung.

Und dann wegen InitSprite() und InitKeyboard(). Es ist praktisch, dass man das alles einzeln initialisieren kann. Vielleicht möchte man ja Sprites darstellen, aber die Tastatureingaben über die normale Eventverarbeitung abhandeln. Oder man will mit InitMouse() und InitKeyboard() zwar Maus und Tastatur fangen, aber gar nicht mit Sprites arbeiten. Es ist schon wichtig, dass das alles getrennt ist. Und du musst zugeben, dass das jetzt kein hoher Aufwand ist. Wenn du eh immer nur alles zusammen verwendest, kannst du dir ja deine eigene Include mit ein paar Wrapper-Befehlen bauen, die du einfach in jedes Projekt mit rein nimmst.

Print und Zahlen.
Du hättest bei Print gerne die selbe Möglichkeit wie bei Debug? Das geht leider nicht direkt, aber neuerdings kann man Strings mit Zahlenvariablen verknüpfen ohne Str() zu nutzen.

Code: Alles auswählen

zahl = 5
Print("zahl=" + zahl)
Leider funktioniert das nur mit einzelnen Variablen und nicht etwa so:

Code: Alles auswählen

Print("Ergebnis=" + (zahl * 2)
Bild
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Langsamer Code

Beitrag von Josh »

Peti hat geschrieben:... oder Loadimage den Decoder an Hand der Endung selber wählt
Es soll Fälle geben, wo zur Kompilierzeit noch nicht fest steht, welche Images geladen werden. Ich hätte mir früher auch gewünscht, dass dies automatisch geht, aber dabei Eingaben zur Laufzeit nicht bedacht. Die paar Zeilen manuell hinzuzufügen, ist definitiv nicht das große Drama.
NicTheQuick hat geschrieben:Er fragt sich, warum man Procedures im Voraus deklarieren muss. Antwort: Das liegt auch daran, dass es ein Single-Pass-Compiler ist.
Es liegt nicht 'auch' daran, es liegt daran :mrgreen:
Peti
Beiträge: 7
Registriert: 25.04.2018 22:36

Re: Langsamer Code

Beitrag von Peti »

Zu deinen Fragen.

Wie ich das meine mit den Proceduren ?

Nun einfach dahin das man diese unnötige Einschränkung behebt in dem der Compiler diese vor der Compilierung an den Anfang setzt oder beim Eingeben der Kopfzeile wird automatisch eine Deklaration an den Anfang geschrieben, sehe da wirklich kein Problem. Machen andere Basics ja auch und kaum langsamer.

Warum hab ich mich für PB entschieden?

Grundsätzlich weil ich schreibfaul bin und daher Basic liebe ;) Bin auf der suche, wollte es ausprobieren. Es mittlerweile kaum moderne Basics gibt die die neusten Librarys unterstützen sowie 64 Bit.
Viele gute Ansätze werden nach kurzer Zeit nicht mehr weiter entwickelt da vermutlich finanziell uninteressant, insbesondere bei kostenlosen lebenslangen UG.
Gleiches galt für Blitz3D mit dem ich sehr zufrieden war. Seine Syntax ist wesentlich logischer und der zu schreibende Code sicherlich 30% kürzer als in PB. Der Umgang mit DirectX7 ist sehr einfach und es hatte ein klares Konzept, teilweise ist es auch deutlich schneller als PB , leider einfach in die Jahre gekommen. Deine Erklärung aus Sicht des Entwicklers kann man teilen,man kann jedes Problem erklären. Aus Sicht des Benutzers möchte man jedoch eine Lösung. Stell dir vor du müsstes um dein Auto zu starten, an einer Kurbel drehen und der Hersteller würde dir dies mit unnötigem Gewicht durch den Anlasser erklären ;)
Speicherbedarf/ Programmgrösse oder Geschwindigkeit des Compilers ist auf heutigen Rechnern kaum eine Frage, wenn schon eher Resourcenbedarf zur Laufzeit.(Sonst dürftest du auch keine 64Bit Anwendungen schreiben, da steht zu 98% in den oberen 4 Bytes der wert 0 ;))

Aber nochmals vielen Dank für die freundlichen Erläuterungen, die Community hier ist wirklich Top.
Peti
Beiträge: 7
Registriert: 25.04.2018 22:36

Re: Langsamer Code

Beitrag von Peti »

Zu deinen Fragen.

Warum hab ich es gekauft ?
Um es zu testen. Weil ich schreibfaul bin und desshalb Basic liebe. Weil mein Blitz3D (mit dem ich sehr zufrieden war) in die Jahre gekommen ist.

Wie ich das meine mit den Proceduren ?
Das einfachste wäre automatisch vom Editor eine verdeckte Deklaration am Programmanfang einzufügen und schon wäre die Beschränkung aufgehoben.
Aber eigentlich muss dies der Entwickler lösen. (desshalb heisst er ja so)

Aus Sicht des Entwicklers ?

Du meinst, wenn du dein Auto mit einer Kurbel starten müsstest und dir der Entwickler erklärt dies sei sinnvoll, weil dadurch das unnötige Gewicht des Anlassers eingespart werden kann? ;)
Der sollte eigentlich die Problemlösung und das Bedürfnis des Benutzers und nicht seine eigene Sicht sehen. ;)
Und wenn dieser aber findet 3 x langsamer bei Division ist ok, für mich ist das nicht ok (300% !). Div und idiv sind übrigens in Ordnung, das verwenden andere auch, da ist was anderes faul genauso wie bei den Zuweisungen zu Feldern die 50% zu langsam sind.
Die Grösse des Codes bei heutigen Systemen ist ausser für vorchristliche Puritaner kaum relevant, eher der Ressourcenbedarf zur Laufzeit und da ist schneller immer besser.

Danke für deinen Typ mit Godot Engine, besitze schon Unity

Nochmals vielen Dank für eure freundliche Unterstützung, wenigstens die Community ist Top.
Peti
Beiträge: 7
Registriert: 25.04.2018 22:36

Noch ein Test

Beitrag von Peti »

Nachtrag: Folgende Progrämmchen läuft in Blitz3D 300% schneller als in PB.
Auf meinem Rechner 500ms zu 1519ms
Da ist definitiv vieles faul.

Code: Alles auswählen

OpenConsole()

Dim feld(1920,1080)
RGB=5646469

zeit = ElapsedMilliseconds()

For d=0 To 100
  For y=0 To 1080
    For x=0 To 1920
      feld(x,y)=RGB
    Next
  Next
Next

PrintN (Str(ElapsedMilliseconds()-zeit))
Print("Druecken Sie Enter zum beenden")
Input()
End
__________________________________________________
Code-Tags hinzugefügt
31.08.2019
RSBasic
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Langsamer Code

Beitrag von Josh »

Könntest du bitte mal CodeTags verwenden? Ich glaube kaum, dass die Mods hier auf Dauer Lust haben deine Beiträge nachzubearbeiten.

Tausch mal die folgenden Zeilen aus:

Code: Alles auswählen

For y=0 To 1080
For x=0 To 1920
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Noch ein Test

Beitrag von Mijikai »

Peti hat geschrieben:Nachtrag: Folgende Progrämmchen läuft in Blitz3D 300% schneller als in PB.
Auf meinem Rechner 500ms zu 1519ms
Da ist definitiv vieles faul.
...
Kannst du den Blitz3D Code posten?
ST4242
Beiträge: 42
Registriert: 29.10.2011 16:54

Re: Langsamer Code

Beitrag von ST4242 »

Hallo,

die Reihenfolge in der auf den Speicher zugegriffen wird ist immens wichtig.

Bei kommt hier ein Zeitunterschied von über 200 % von dem auf dem ersten Blick gleiche Programmcode.

Viele Grüße

Code: Alles auswählen

OpenConsole()

Dim feld(1920,1080)
RGB=5646469

zeit = ElapsedMilliseconds()

For d=0 To 100
  For y=0 To 1080
    For x=0 To 1920
      feld(x,y)=RGB
    Next
  Next
Next

PrintN (Str(ElapsedMilliseconds()-zeit))

zeit = ElapsedMilliseconds()

For d=0 To 100
  For x=0 To 1920
   For y=0 To 1080
      feld(x,y)=RGB
    Next
  Next
Next


PrintN (Str(ElapsedMilliseconds()-zeit))
Print("Druecken Sie Enter zum beenden")
Input()
End
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Langsamer Code

Beitrag von Mijikai »

ST4242 hat geschrieben:Hallo,

die Reihenfolge in der auf den Speicher zugegriffen wird ist immens wichtig.

Bei kommt hier ein Zeitunterschied von über 200 % von dem auf dem ersten Blick gleiche Programmcode.
...
Nice, 552 ms <)

Ich vermute zudem das der Blitz3D Code weniger Schleifen hat,
da der Code sich auf die Bildschirmgröße bezog. :)

Code: Alles auswählen

;-> Dim feld(1919,1079)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Langsamer Code

Beitrag von STARGÅTE »

ST4242 hat geschrieben:Hallo,

die Reihenfolge in der auf den Speicher zugegriffen wird ist immens wichtig.

Bei kommt hier ein Zeitunterschied von über 200 % von dem auf dem ersten Blick gleiche Programmcode.

Viele Grüße

Code: Alles auswählen

OpenConsole()

Dim feld(1920,1080)
RGB=5646469

zeit = ElapsedMilliseconds()

For d=0 To 100
  For y=0 To 1080
    For x=0 To 1920
      feld(x,y)=RGB
    Next
  Next
Next

PrintN (Str(ElapsedMilliseconds()-zeit))

zeit = ElapsedMilliseconds()

For d=0 To 100
  For x=0 To 1920
   For y=0 To 1080
      feld(x,y)=RGB
    Next
  Next
Next


PrintN (Str(ElapsedMilliseconds()-zeit))
Print("Druecken Sie Enter zum beenden")
Input()
End
Wow, hier auf meinem Rechner habe ich sogar:
7599
1555
Druecken Sie Enter zum beenden
Also 5 mal schneller. Danke für den Hinweis.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten