Int, Short oder Byte? + Paar Fragen

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Nova

Betreff: Int, Short oder Byte? + Paar Fragen

BeitragDi, Jul 17, 2012 17:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Welchen Dateityp sollte man eigentlich verwenden, wenn man beispielsweise nur Zahlen von 0 bis 100 benutzen will? Zwar verbrauchen short und byte weniger Speicherplatz als int, allerdings muss der Computer diese ja "emulieren", da er intern gar nicht mit diesen rechnet, sondern eher mit integer (oder long bei 64 Bit. Kann man mit BlitzMax eigentlich ein 64-Bit-Programm schreiben?)
Ist es also schneller, immer mit int zu arbeiten, oder sollte man wirklich dort, wo kleine Zahlen erwartet werden, auch kleine Variablentypen nehmen?

Ich hätte eigentlich noch ein paar Fragen zu BlitzMax, allerdings weiß ich nicht, ob man die alle in einen "Sammelthread" stellen sollte, oder doch thematisch getrennt in mehrere Threads. Oder vielleicht irgendeine andere Art? Chat oder so?

(Und ja, mir ist bekannt, dass man bei Geschwindigkeitsproblemen eher seine Algorithmen optimieren sollte. Ist nur eine hypothetische Frage. Wink)
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit
  • Zuletzt bearbeitet von Nova am Di, Jul 17, 2012 18:12, insgesamt einmal bearbeitet

ZEVS

BeitragDi, Jul 17, 2012 17:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein kleiner Test:
BlitzMax: [AUSKLAPPEN]
SuperStrict
Local in:Int, by:Byte
Const ITERATIONS:Int = 10000000
Local start:Int, finish:Int

start = MilliSecs()
For Local i:Int = 0 Until ITERATIONS

in :+ 1:Int

Next
finish = MilliSecs()
Print "INT: "+(finish-start)

start = MilliSecs()
For Local i:Int = 0 Until ITERATIONS

by :+ 1:Byte

Next
finish = MilliSecs()
Print "BYTE: "+(finish-start)

Output (Debug, Windows): Code: [AUSKLAPPEN]
INT: 687
BYTE: 733

Was das für dich bedeutet, musst du selbst wissen.
Zitat:
Kann man mit BlitzMax eigentlich ein 64-Bit-Programm schreiben?

Mir nicht bekannt. Zumindest wird Windows intern als Win32 bezeichnet...

ZEVS

Xeres

Moderator

BeitragDi, Jul 17, 2012 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax ist nicht auf 64 ausgelegt (und ich glaube, da der Compiler nicht offen ist, wird das auch nichts mehr in Zukunft).
Ob du Speicher für Rechenzeit eintauschst (wenn der Effekt überhaupt ausschlaggebend ist), musst du dir überlegen.

Pass den Titel ggf. an und stell deine Fragen ruhig hier. Der Chat kann natürlich schneller sein - kommt aber darauf an, ob die Leute mit Ahnung auch da sind.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Nova

BeitragDi, Jul 17, 2012 18:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Joa, so hätte ich das ganze auch gemacht ZEVS. Hatte aber gedacht, dass sich jemand vielleicht mit theoretischem Wissen darüber äußert. (Also ob tatsächlich erst alle Berechnungen mit Integern emuliert werden und dann erst wieder auf die Ursprungsgröße gestutzt.)

Danke für die Antwort Xeres (und auch ZEVS)! Smile

Weitere Frage:
Funktioniert Multithreading jetzt eigentlich vernünftig unter BlitzMax oder muss man sich weiterhin mit irgendwelchen Problemen rumschlagen, die das ganze wieder mit starken Nachteilen belegen?
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit

Noobody

BeitragDi, Jul 17, 2012 18:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Das eigentliche Rechnen mit Bytes/Shorts ist genau gleich schnell wie mit Ints. Der einzige Unterschied besteht beim Lesen und Schreiben in den Arbeitspeicher.

Da die CPU nur in Wortgrösse lesen und schreiben kann (meistens 32 bit), kann ein Byte oder ein Short nicht direkt gelesen oder geschrieben werden. Beim Lesen muss das ganze Wort gelesen und das Byte/Short rausgefiltert werden (*sollte* gleich schnell oder höchstens einen Zyklus langsamer sein als bei einem Int). Beim Schreiben muss das ganze Wort gelesen, das Byte/Short hineingeshiftet und das neue Wort zurückgeschrieben werden. Im Vergleich zu "einfach mal schnell schreiben" bei einem Datentyp mit Wortgrösse ist das natürlich um einiges langsamer, da ein zusätzlicher Lesevorgang dazukommt (und Lesen vom RAM ist vergleichsweise teuer).

Ob es schlussendlich langsamer ist, kommt stark auf das Programm an. Ein Bytearray z.B. passt besser in den Cache und kann davon vielleicht profitieren im Vergleich zu einem Intarray, kann also je nach Umgebung schneller oder langsamer sein.

Schlussendlich aber spielen solche Feinheiten eine eher kleine Rolle - wenn man wirklich so viel Performance herausholen will, dass solche Themen relevant sind, ist man bei BMax eher an der falschen Adresse.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

FireballFlame

BeitragDi, Jul 17, 2012 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
ZEVS: Man sollte übrigens nach dem Programmstart ein paar Sekunden warten, bevor man Speedtests macht, weil da eventuell noch irgendwas initialisiert wird, was die Ergebnisse beeinflusst.
Wenn ich ein Delay 5000 davorpacke (und Debugmodus ausmache!) bekomme ich als Ergebnis "Int: 7 Byte: 35". Das ist ein recht deutlicher Unterschied. Letztlich kommt es aber trotzdem auf den speziellen Fall an, was sinnvoller ist...

Nova: Bin mir nicht sicher, was du mit "jetzt" meinst; verglichen mit früheren BMax-Versionen, oder verglichen mit BB? Multithreading funktioniert prinzipiell, aber iirc sind wohl die Module nicht wirklich darauf ausgelegt. Das heißt mit z.B. Max2D oder Reflection könnte man wohl Probleme kriegen. Genau weiß ich es allerdings nicht, habe wenig eigene Erfahrung damit.
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Nova

BeitragDi, Jul 17, 2012 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
@FireballFlame: Ich meine im Vergleich zu früheren Versionen von BlitzMax. Habe beispielsweise gelesen, dass der Garbage-Collector schnarchlangsam bei Multithreading sein soll.

Noch 'ne Frage: Gibt es eine schönere Variante, ein Int-Array in ein Float-Array umzuwandeln, als alle inneren Werte einzeln zu casten? Hier mein momentaner Code, bei dem alle Variablen Integer sind. DrawPoly verlangt dabei ein Array aus Floats:
BlitzMax: [AUSKLAPPEN]
DrawPoly ( [x, y, x + breite, y, x, y + hoehe, x + breite, y + hoehe] )

Die funktionierende Version hätte halt jede einzelne Variable nach Float gecastet.
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit

ZEVS

BeitragDi, Jul 17, 2012 20:08
Antworten mit Zitat
Benutzer-Profile anzeigen
https://www.blitzforum.de/foru...hp?t=37933 Ähnliches Thema - gleiches Problem. Ist nur über einzelnes Casten zu lösen. Du kannst dir zwar hierfür eine Funktion schreiben, die das macht, aber das ist langsam. Deshalb sollte man in solchen Situationen Floats gegenüber Ints bevorzugen. Außerdem sieht das Beispiel nach einem klaren Fall für DrawRect aus, wo man auch Ints übergeben kann.

ZEVS

Nova

BeitragDi, Jul 17, 2012 20:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Mh, okay, ich dachte, mit DrawRect kann man nur nicht-ausgefüllte Rechtecke machen. Das passiert halt, wenn die interne Hilfe einfach nur Dreck ist und so gut wie gar nichts erklärt. Und warum gibt es jetzt auch noch keine vernünftige Hilfe für BlitzMax vom Blitz Basic Portal? :-/ Irgendwo meine ich mal, eine Begründung dazu gelesen zu haben...
Aber danke für die Hilfe. Wink
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit

Tennisball

BeitragDi, Jul 17, 2012 20:27
Antworten mit Zitat
Benutzer-Profile anzeigen
http://home.arcor.de/plutomani...dex_de.htm
Probier das doch mal Smile

Nova

BeitragDi, Jul 17, 2012 20:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Sieht schon mal sehr schön aus, allerdings fügt Hotdocs leider trotzdem nicht diese schönen, erklärenden Texte hinzu, wie sie hier bei der Blitz-Basic-Hilfe sind. Beispiel SetColor: Bei keiner Hilfe wird gesagt, was mit DrawImage passiert, wenn man beispielsweise 0, 255, 255 einstellt. Inzwischen habe ich gelesen und auch selbst probiert, dass dann der entsprechende Farbwert schwächer (bzw. bei 0 gar nicht mehr) gezeichnet wird. Naja, darauf zu kommen ist recht schwer, da ich selber solches Verhalten bisher nie gesehen habe.
Aber das ist schon recht nützlich, danke. Smile
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit

Xeres

Moderator

BeitragDi, Jul 17, 2012 22:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Dokumentation ist sicher kein Beispiel von erhobener Qualität und Durchsicht - aber lesen hilft schon in den meisten Fällen...
Doku: SetColor hat Folgendes geschrieben:
The SetColor command affects the color of Plot, DrawRect, DrawLine, DrawText, DrawImage and DrawPoly.

Doku: DrawImage hat Folgendes geschrieben:
Drawing is affected by the current blend mode, color, scale and rotation.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Nova

BeitragMi, Jul 18, 2012 0:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Mir ist bewusst, dass SetColor einen Effekt auf DrawImage hat - allerdings WELCHER, das steht dort mit keinem Wort. Es hätte eben so gut sein können, dass die Farben mit SetColor verstärkt anstatt abgeschwächt werden. Oder eine Art "Mindestwert" bei Farben - alles unter 128 wird dann auf 128 aufgefüllt beispielsweise bei SetColor 128, 128, 128. Wink

Ein schönes Beispiel ist auch LoadAnimImage. first_cell und cell_count: Beginnend bei 0 oder 1? Weiß ich nicht wirklich, rumprobieren ist dann einzige Möglichkeit, es rauszufinden. Blitz Basic hat es dort nicht wirklich einfach zu verstehen gemacht, wenn man mit Dim[2] einfach mal gleich 3 Einträge generiert, obwohl keine mir bekannte Sprache das auch so macht - alle gehen dann von 0 bis 1. BlitzMax ist da anscheinend wohl besser.

Schade finde ich, als C++- und Java-Benutzer, natürlich auch die eingeschränkten Funktionalitäten von BlitzMax. Keine Parameter von Konstruktoren, keine Mehrfachvererbung (implement Interface aus Java)...

Dafür allerdings kenne ich keine Sprache, bei der ich in so kurzer Zeit solch grafisch aufwendige Dinge realisieren kann! Very Happy

FireballFlame

BeitragMi, Jul 18, 2012 19:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Nova hat Folgendes geschrieben:
Blitz Basic hat es dort nicht wirklich einfach zu verstehen gemacht, wenn man mit Dim[2] einfach mal gleich 3 Einträge generiert, obwohl keine mir bekannte Sprache das auch so macht - alle gehen dann von 0 bis 1.
Visual Basic Wink

Und das mit den Farben funktioniert eigentlich überall immer gleich. Egal ob bei SetColor in Max2D oder EntityColor in Blitz3D oder ganz wo anders. Daher wurde das wohl nicht extra hingeschrieben. Bei first_cell ist das natürlich eine andere Sache...
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Nova

BeitragMi, Jul 18, 2012 20:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Visual Basic habe ich nicht angeschaut, von daher. Smile

Das mit SetColor: Nunja, ich habe es bisher nie benutzt, von daher. Irgendwo muss man ja anfangen, und wenn dann exakt die Hilfe, mit dessen Programm man anfängt, das ganze nicht erklärt... Wink
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group