quadranto: Kleines programm, große Auslastung.

Moin!

nach vieler Jahre programmiererei mit JavaScript & PHP, habe ich entschlossen, mit einer anderen Programmiersprache zu befassen (bloss kein VB oder .NET) und bin auf "PureBasic" gestoßen und habe es gekauft.

"PureBasic" hört sich stark nach "Basic" an, ist es aber überhaupt nicht. In der Syntax gibt es nur ein paar Basic-Anweisungen wie "Goto" oder "Do-Loop", der rest erinnert mich eher an PHP und C und hat alle vorteile wie eine Hochsprache.
Zudem ist es ohne Probleme möglich, die in PureBasic geschriebene Programme auf OS wie Mac/Amiga/ oder Unix laufen zu lassen, es werden auch keine DLL´s (man kann aber auf alle System-DLL´s wie auch auf DirectX oder OpenGL zugreifen wenn man es benötigt) oder irgendwelche Runtimes benötigt, was sehr genial ist.
Alles in allem eine verdammt geile Sprache mit einem genialen Compiler, doch einen Nachteil hat die ganze geschicht doch.

Egal was für ein Tool oder Programm schreibe, ich habe bei ausführung des Programmes fast immer, auch auf meinem DualCore@2Ghz, 80% auslastung. Egal was mein Programm macht, ob es nur Simpel die Uhrzeit anzeigt oder irgendwelche berechnungen durchführt.
Es liegt an der art des Codes (nur ein ausschnitt), hier mal ein Beispiel eines Typischen Programmes:
--------------------------------------------------------
InitKeyboard()
InitMouse()
InitSprite()
;h=300
;b=400
xScann=0
yScann=0
Dim xScannArray(1000)
Dim yScannArray(1000)
Dim rScann(400*300)
Dim gScann(400*300)
Dim bScann(400*300)
OpenScreen(1024,768,16,"")
LoadSprite(0,"bild.bmp")

Repeat
^-------------------------------------Anfang
ExamineKeyboard()
ExamineMouse()

DisplaySprite(0,0,0)
StartDrawing(ScreenOutput())
 DrawingMode(#PB_2DDrawing_Transparent)
 FrontColor(RGB(255,255,0))
 For a= 0 To 400
  DrawText(0,350,Str(a))
  If a>=400
   a=0
  EndIf
 Next

StopDrawing()

FlipBuffers()
ClearScreen(0)
Until KeyboardPushed(#PB_Key_Escape)
^----------------------------------------Ende

Der auszuführende Code wird immer und immer ausgeführt, bis die Taste (vordefinierter Tastencode) ESC gedrückt wird.

Daher wohl die extreme Auslastung.

Nun aber meine Frage, ist sowas auch bei in C geschriebenen Programmen? Ist sowas völlig normal als nicht "Ereigniss-gesteuerte-Programmiersprache" oder gäbe es auch andere möglichkeiten ein Programm auf dieser art, aber ohne dieser hohen auslastung, zu schreiben?
Es kann ja eigentlich nicht sein, dass ein kleines Tool (egal für welchen zweck) einen ganzen Rechner beansprucht.
Ich kann natürlich auch "Function"´s ausserhalb der Schleife schreiben die hin und wieder aufgerufen werden, die Auslastung bleibt die gleiche da eigentlich immer eine Schleife das Programm am "Leben" hält.....

Hat jemand eine Idee oder Lösung?

  1. Yerf!

    Nun aber meine Frage, ist sowas auch bei in C geschriebenen Programmen?

    Ja, denn das Programm läuft ja ständig in der Schleife und "macht irgendetwas". Deshalb bekommt es vom System auch entsprechend Prozessorzeit.

    Ist sowas völlig normal als nicht "Ereigniss-gesteuerte-Programmiersprache" oder gäbe es auch andere möglichkeiten ein Programm auf dieser art, aber ohne dieser hohen auslastung, zu schreiben?

    Schau mal, ob es irgendeinen Wait oder Sleep-Befehl gibt. Dieser sollte das Programm etwas runterbremsen und Prozessorzeit an das System/andere Programme abgeben.

    Gruß,

    Harlequin

    --
    <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
  2. Hi,

    Alles in allem eine verdammt geile Sprache mit einem genialen Compiler

    finde ich auch. Und die compilerten Programme können such von der Effizienz her durchauas mit C messen.

    Egal was für ein Tool oder Programm schreibe, ich habe bei ausführung des Programmes fast immer, auch auf meinem DualCore@2Ghz, 80% auslastung. Egal was mein Programm macht, ob es nur Simpel die Uhrzeit anzeigt oder irgendwelche berechnungen durchführt.

    Das hat damit zu tun, dass PureBasic auf einer sehr "tiefen" Ebene arbeitet und es dem Programmierer überläßt, dafür zu sorgen, dass auch andere Windows-Prozesse zum Zuge kommen. "Freiwillig" gibt PureBasic keine ihm zugeteilte keine Prozessorzeit frei, um eben möglichst schnell arbeiten zu können.
    Es liegt also zunächst an Dir zu entscheiden, an welchen Stellen das Programm wartenden Prozessen  Zeit einräumt; die Schleife:
    While WindowEvent() : Wend
    sorgt z.B. dafür.

    Des weiteren kannst Du für solche Endlosschleifen die ThreadPriority() heruntersetzen.

    freundliche Grüße
    Ingo

    1. Moin@Ingo&Harlequin,

      danke euch beiden, hat mir geholfen.
      Lesen uns.