Aktuelle Zeit: 11.12.2019 00:31

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 32 Beiträge ]  Gehe zu Seite 1, 2, 3, 4  Nächste
Autor Nachricht
 Betreff des Beitrags: Langsamer Code
BeitragVerfasst: 29.08.2019 18:31 
Offline

Registriert: 25.04.2018 22:36
Verzeihung wenn ich hier falsch bin. Habe PureBasic gekauft und mit der neusten Version 5.71 rumgespielt.
Dabei ist mir das selbe aufgefallen wie bei der älteren Demoversion. Nämlich das der Compiler sehr unterschiedlich schnellen Code erzeugt wie an folgenden Beispiel zu sehen ist.
(Und ja ich hab den Debugger ausgeschaltet)

Code:
#ScreenWidth = 1920
#ScreenHeight = 1080

If InitSprite() = 0 Or InitKeyboard() = 0
MessageRequester("Error", "DirectX is needed.",0)
EndIf

If OpenScreen(#ScreenWidth, #ScreenHeight, 32, "PB Plasma")

zeit=ElapsedMilliseconds()
RGB=255 <<24+255<<16+255<<8+0

If StartDrawing(ScreenOutput())
Buffer = DrawingBuffer() ; Get the start address of the screen buffer
Pitch = DrawingBufferPitch() ; Get the length (in byte) took by one horizontal line
PixelFormat = DrawingBufferPixelFormat() ; Get the pixel format.

For d=1 To 100 ;100 x Screen mit Pixel beschreiben

For y = 0 To #ScreenHeight-1
For x = 0 To #ScreenWidth-1 ;Rechne alles in der innersten Klammer (auch y, nur Test)
;Var 1 Direkt in Klammer
;PokeL(buffer+Pitch*y+x*4,RGB) ;940 Millisec
;Var 2
;b=buffer+Pitch*y
;b=b+x*4
;PokeL(b,RGB) ;1920 Millisec
;Var 3
;h=Pitch*y
;b=x*4
;hb=h+b
;PokeL(buffer+hb,RGB) ;1656 Millisec
;Var 4
b=buffer+pitch*y+x*4
PokeL(b,RGB) ; 2625 Millisec
Next
Next

Next
StopDrawing()
EndIf

ExamineKeyboard()
FlipBuffers()

Else
MessageRequester("Error","Can't open the screen !",0)
EndIf

MessageRequester("Zeitr",Str(ElapsedMilliseconds()-zeit),0)


Man sieht stark unterschiedliche Laufzeiten nur durch Unterteilung einer einfachen Rechnung.
Des weiteren ist mir aufgefallen das Divisionen 3 mal länger (3x!) brauchen als in C oder z.b. Blitzbasic. Auch Zuweisungen zu Integer-Feldern benötigen die doppelte Zeit als in Blitz3D. Bei Floating ist der Wert allerdings gleich. Bin ich der erste der das bemerkt ? Lösungen ? Bei den 3D Möglichkeiten scheint auch viel Luft nach oben zu sein zumal alle wichtigen Befehle zu fehlen scheinen. Ogre nun ja.... Ich weiss die Neuen motzen immer ;) Kann mir da trotzdem jemand helfen ?

Edit by NicTheQuick: Code-Tags gesetzt


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Langsamer Code
BeitragVerfasst: 29.08.2019 19:37 
Offline
Benutzeravatar

Registriert: 25.09.2016 01:42
Der Code wird so nichtmal mit PureBasic auf verschiednene PCs gleichschnell laufen.
Am besten alles was "verbuggt" sein soll isolieren und einzeln mit mehreren Durchläufen testen.

_________________

Links:
PureBasic Discord
[ENGINE] 2D Engine Nautilus (Win)
[INCLUDE] GLFW 3.3 Library
[MODULE] Bass Library 2.4 (Win)
[LIBRARY] Hexi Binary2Hex (Win)



Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Langsamer Code
BeitragVerfasst: 29.08.2019 19:40 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
1. Debugger ausschalten.
2. Nicht PokeL verwenden, sondern direkt schreiben.

Speicherschreibaufträge (LONG) = 1920 * 1080 * 100 = 207360000

bei mir etwa 1200 Millisekunden. Das heisst in 12 ms wurde der ganze Bild-speicher komplett beschrieben. 2073600 Long-Werte.

Langsam finde ich das nicht.
Code:
#ScreenWidth = 1920
#ScreenHeight = 1080

If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Error", "DirectX is needed.",0)
EndIf

Structure Pixel
  Pixel.l
EndStructure

If OpenScreen(#ScreenWidth, #ScreenHeight, 32, "PB Plasma")
 
  zeit=ElapsedMilliseconds()
  RGB=255 <<24+255<<16+255<<8+0
 
  If StartDrawing(ScreenOutput())
    Buffer = DrawingBuffer() ; Get the start address of the screen buffer
    Pitch = DrawingBufferPitch() ; Get the length (in byte) took by one horizontal line
    PixelFormat = DrawingBufferPixelFormat() ; Get the pixel format.
   
    For d=1 To 100 ;100 x Screen mit Pixel beschreiben
     
      For y = 0 To #ScreenHeight-1
       
        *Line.Pixel = Buffer+Pitch*y
       
        For x = 0 To #ScreenWidth-1
          *Line\Pixel = rgb
          *Line+4
        Next
      Next
       
    Next
    StopDrawing()
  EndIf
 
  ExamineKeyboard()
   
  FlipBuffers()
 
  CloseScreen()
Else
  MessageRequester("Error","Can't open the screen !",0)
EndIf

MessageRequester("Zeitr",Str(ElapsedMilliseconds()-zeit),0)


_________________
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Langsamer Code
BeitragVerfasst: 29.08.2019 19:47 
Offline
Benutzeravatar

Registriert: 25.09.2016 01:42
Ihr ignoriert VSync...

_________________

Links:
PureBasic Discord
[ENGINE] 2D Engine Nautilus (Win)
[INCLUDE] GLFW 3.3 Library
[MODULE] Bass Library 2.4 (Win)
[LIBRARY] Hexi Binary2Hex (Win)



Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Langsamer Code
BeitragVerfasst: 29.08.2019 19:52 
Offline
Benutzeravatar

Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9
wo soll da jetzt der Bug sein?

_________________
Schrödingers Smiley :):


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Langsamer Code
BeitragVerfasst: 29.08.2019 20:33 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Da ist kein Bug. Deswegen steht es jetzt in Allgemein. :allright:

_________________
Neustes Video: Neje DK - 1 Watt Laser Engraver
Ubuntu Gnome 19.04 LTS x64, PureBasic 5.71 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Langsamer Code
BeitragVerfasst: 29.08.2019 22:40 
Offline
Kommando SG1
Benutzeravatar

Registriert: 01.11.2005 13:34
Wohnort: Glienicke
>> "Man sieht stark unterschiedliche Laufzeiten nur durch Unterteilung einer einfachen Rechnung."
Das ist einfach zu erklären.
Im ersten Fall wird kein "weiterer" Schreibvorgang auf eine Variable benötigt, die Rechung erfolgt komplett in den general purpose registers.
Im 2. und 3. Fall müssen die Zwischenvariablen sowohl geschrieben als auch gelesen werden. Der PB Compiler optimiert hier nicht, indem er erkennt, dass du z.b. Variable "b" gleich weiter verwendest und führt somit: "MOV qword [v_b],r15" und danach MOV rcx,qword [v_b] aus.
Warum bei dir der 4. Fall am langsamsten ist, kann ich nicht begründen, bei mir ist er schneller als Fall 1 und 2, was logisch wäre, da ich nur eine Hilfsvariable habe.

>> "Des weiteren ist mir aufgefallen das Divisionen 3 mal länger (3x!) brauchen als in C oder z.b. Blitzbasic."
PureBasic verwendet für die 3er Division auch "nur" den "IDIV" Befehl, allerdings kann man die 3er Division (oder auch andere) durchaus schneller ausführen, wenn man zuerst das Inverse berechnet und dann Multipliziert. Das hängt aber sehr stark von der jeweiligen CPU Architektur ab!

Es mag sein das der PB-Compiler wenig oder kaum optimiert. Allerdings ist er dafür halt ein Single-Pass-Compiler und wie ich finde ein sehr schneller. Außerdem hast du jeder Zeit die Möglichkeit, Zeitkritischen Code direkt in ASM zu schreiben. Wobei ich den Screen trotzdem nicht mit Hilfe der armen CPU zupixeln würde. Das sollte man Shadern für die Grafikkarte überlassen.

_________________
Bild
 
BildBildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Langsamer Code
BeitragVerfasst: 30.08.2019 00:05 
Offline

Registriert: 25.04.2018 22:36
Also mal vielen Dank für die Erläuterungen. Natürlich ist es kein Bug wenn ein Befehl 3 mal langsamer ist als in anderen Basics oder Feld-Zuweisungen in Integer halb so schnell. Und natürlich kann man es mit Assembler lösen aber hätte schon erwartet das solch einfache Sachen in einem Basic, dass es schon einige Zeit gibt besser optimiert sind. Genauso diese kleinen unnötigen Dinge wie Proceduren am Ende, wäre keine grosse Sache dies mit einem einfachen Skript zu beheben. Oder Print Zahlen und Text anzeigen zu lassen oder Loadimage den Decoder an Hand der Endung selber wählt. Genauso InitSprite() InitKeyboard() und Prüfung könnte man in einen Befehl packen (z.B. Open3D) usw. Hab erst ein paar Stunden rumgespielt aber mir fehlt ein bisschen die liebe zum Detail. Ausserdem muss man in PB viel schreiben und die Schlüsselworte sind teilweise extrem lang. Mal sehen was ich damit mache. Auf jeden Fall nochmals vielen Dank.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Langsamer Code
BeitragVerfasst: 30.08.2019 00:48 
Offline
Kommando SG1
Benutzeravatar

Registriert: 01.11.2005 13:34
Wohnort: Glienicke
/:-> Ähm, warum hattest du dich noch mal für den Kauf von PureBasic entschieden?

Da du wieder einige sehr präzise Beispiele aufzählst, möchte ich diese auch noch mal (aus Sicht der/eines Entwickler) Kommentieren:

>> "aber hätte schon erwartet das solch einfache Sachen in einem Basic, dass es schon einige Zeit gibt besser optimiert sind."
"optimiert" ist ein Begriff der noch ein Bezug verlangt. Natürlich kann man jede mögliche Division in der Zeit optimieren indem man sie einfach vorher ausrechnet und in einer Art Hash-Tabelle nachschlägt, oder besondere Formeln verwendet. Zum Teil wird das in PureBasic schon gemacht: ASM - fyl2x langsammer als Log10 oder Log ? (nur alsBeispiel)
Aus sieht der Entwickler besteht/bestand aber scheinbar keine Notwendigkeit dafür, alles auf Ausführungszeit zu optimieren, dafür aber an andere Stelle mehr externe Libraries, Speicher oder sonst was zu benötigen.

>> "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?

>> "Oder Print Zahlen und Text anzeigen zu lassen"
Ja, kann man in betracht ziehen.

>> "oder Loadimage den Decoder an Hand der Endung selber wählt."
Das macht LoadImage doch, soweit ich weiß, sogar anhand des Dateiinhalts! Nur ist zur zeit der Kompilierung nicht bekannt, welche Decoder benötigt werden, und es ist einem Benutzer wie uns nicht zuzumuten, die EXE immer mit allen Decodern zuzumüllen, also entscheidet dieser selbst welche eingebaut werden sollen.

>> "Genauso InitSprite() InitKeyboard() und Prüfung könnte man in einen Befehl packen (z.B. Open3D) usw."
S.o. dann wäre in vielen Fällen immer "etwas zu viel" in der EXE, und da es ein Single-Pass-Compiler ist, kann es auch nachträglich nicht wieder entfernt werden, wenn Bibliotheken gar nicht verwendet werden.

>> "Außerdem muss man in PB viel schreiben und die Schlüsselworte sind teilweise extrem lang."
Dann wäre wohl die Godot Engine ehr was für dich? Wobei ich wie gesagt nicht weiß, für welches Zweck du PureBasic gekauft hast?

_________________
Bild
 
BildBildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Langsamer Code
BeitragVerfasst: 30.08.2019 09:36 
Offline
Admin
Benutzeravatar

Registriert: 05.10.2006 18:55
Wohnort: Berlin
Hallo Peti

Peti hat geschrieben:
Ausserdem muss man in PB viel schreiben und die Schlüsselworte sind teilweise extrem lang.

Dank Autovervollständigungsfunktion musst du nicht komplett ausschreiben.
Ansonsten kannst du auch ein Macro schreiben, z.B.:
Code:
Macro EndProc
  EndProcedure
EndMacro

_________________
BildBildBildBild BildBild


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 32 Beiträge ]  Gehe zu Seite 1, 2, 3, 4  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: Majestic-12 [Bot] und 3 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye