German Gibt es schnelle Rechenoperationen?

Midimaster

Active Member
Licensed User
Unter meiner alten Sprache gab es "besonders schnelle" Additionen und Multiplikationen für zeitkritische Echtzeit-Berechnungen. Gibt es sowas ähnliches auch unter B4A?

Es geht um eine 2-dimensionales Short-Array z.b. A(1000,20) , aus dem aus den senkrechten 99 Werten eine Summe gebildet werden muss. Dabei muss auch noch ein Faktor f als Multiplikator bedacht werden. Sowohl die Array-Werte als auch die Multiplikatoren ändert der User in Echtzeit ständig.

Der Code ist nur zur Verdeutlichung.

B4X:
Dim MyArray(500.000, 100) as SHORT
Dim f(100) as FLOAT
....
For i=0 To 9999
    For j=1 to 99
        Private sum As Int
        sum=sum + MyArray(i,j) * f(j)
    Next
    MyArray(i,0)=sum   
Next

Derzeit brauche ich auff meinem S10 keine 1msec dafür, aber auf einem Android4.4-Tablet stolze 500msec!

Ich suche nicht nach Methoden, die asynchron das Problem lösen. Das mache ich bereits im echten Code. Ich suche auch nicht nah Tricks, die etwas vorab schon berechnet bereithalten. Es geht wirklich nur darum, ob man so eine Iteration, Summe und Multiplikation schneller hinbekommt.

Danke Euch schon jetzt mal
 

DonManfred

Expert
Licensed User
Longtime User
Android ist Eventdriven. Es gibt keine echtzeitanwendungen in Android.
Entsprechend gibt es keine Methoden die etwas beschleinigen.
 

Midimaster

Active Member
Licensed User
das ist nicht, was ich meine.... Eine B4A-Basic-Anweisung musss doch in eine JAVA-Anweisung compiliert werden. Hierbei entstehen für jede Anweisung massiv viele JAVA-Funktionsaufrufe, bis dann endlich die eigentliche Rechenaufgabe erfolgt, Parameter müssen übergeben werden, ev. auf Fehler geprüft werden. Nun gab es in BlitzMax immer die Möglichkeit, solche Zusatzaktionen abzuschalten, weil der Funktionsaufruf, die nächsten 200.000x immer genau so erfolgen wird und die Arraygrenzen 100% eingehalten werden, etc... Dadurch wurde der ganze Overhead weggenommen und quasi ohne Netz und doppelten Boden gleich gerechnet. Dadurch waren Geschwindigkeitssteigerung von x100 möglich.

Das sit so ähnlich, wie ja auch die Verwendung von Erels ByteConverter()-Routinen wesentlich schneller sind, als wenn ich das gleiche Prinzip von BASIC aus schreibe.
Weißt Du , was ich meine?

https://www.b4x.com/android/forum/threads/fast-arrays-access.92951/#content
 

DonManfred

Expert
Licensed User
Longtime User
Das sit so ähnlich, wie ja auch die Verwendung von Erels ByteConverter()-Routinen wesentlich schneller sind, als wenn ich das gleiche Prinzip von BASIC aus schreibe.
Weißt Du , was ich meine?
Die routinen sind von vorne herein in JAVA geschrieben (ByteConverter ist eine JAVA Library). Nix was der B4A Compiler erst noch nach JAVA übersetzen muss.

Schreibe eine Library die all das in JAVA macht.
 

OliverA

Expert
Licensed User
Longtime User
Es geht wirklich nur darum, ob man so eine Iteration, Summe und Multiplikation schneller hinbekommt.
Derzeit brauche ich auff meinem S10 keine 1msec dafür, aber auf einem Android4.4-Tablet stolze 500msec!
Im Bereich des CPUs und Speicher, wie viel langsamer ist das Tablet? Vielleicht stößt du gegen die Hardware grenzen des Tablets.
 

Midimaster

Active Member
Licensed User
Nachdem ich die App auf dem S10 entwickelt habe, gehen ich nun zu einem 6 Jahre alten Tablet zurück, wo nicht genügend Rechenleistung und Speicher zur Verfügung steht und optimiere die App da, wo es für das Tablet nötig ist.

z.b.
Während z.b. das Laden der 33MB auf dem S10 unter 200msec fertig war, dauert es auf dem Tablet 5 Sekunden. Also ersetze ich die harmlose Lade-Routine durch eine asynchrone mit Fortschrittsbalken, damit der User was zu sehen kriegt und das Gefühlt hat, es geht voran.

z.b.
Das komplette Berechnen des Datenfeldes dauerte auf dem S10 unter 100msec und auf dem Tablet schon wieder 5 Sekunden. Ich ersetze also die harmlose Berechung durch eine asynchrone, die dem 100msec-Timer eine Chance lässt, die "Echtzeit"-Aktionen für den User scheinbar weiterlaufen zu lassen. Ihr kennt das bestimmt von Spielen... Die Berechnung des gesamten Feldes wird auf 50 Teilfelder aufgeteilt, so dass jedes nur 100msec benötigt. Dadurch kann der Timer wieder ticken.

Ich mache ja Musiksachen und da darf der Audio-Stream halt nie abreissen.

hierbei würden natürlich Algorithmen helfen, die deutlich schneller laufen als andere. Wie z.b. die ByteConverter-Library von Erel. Ich dachte vielleicht gibt es ja sowas auch für Multiplikationen Additionen oder große Arrays.

Momentan habe ich das asynchrone Laden bereits im Griff und auch die Datenfeldberechnung läuft getaktet. Dadurch reisst nun auch auf dem Tablet der Audio-Stream nicht mehr ab, owohl ich ihn nur alle 100msec mit 100msec-Material versorge.

Screenshot:
1593586473378-png.96447
 

Cadenzo

Active Member
Licensed User
Longtime User
Nicht ganz zum Thema aber vielleicht interessant: Dunkel kann ich mich erinnern, dass ich vor Zeiten auch mal mit dem Audiostreamer spielte und vor der Frage stand, wie ich den verbliebenen Buffer-Inhalt ermitteln kann, um z.B. Löcher zu vermeiden. Irgendwie kam ich dann zur Lib AudioTrack und die blockierenden Funktionen WriteByte bzw WriteShort. In einem Extra Thread hat man da viel bessere Kontrolle.

Es scheint ja bei B4X mehrere Musiker zu geben. Meine Apps gehen neben App-Assionato meist den umgekehrten Weg, Wave-Analyse (z.B. Stimmgeräte, Tonerkennung) und weniger Synthese.
 
Top