Airplay-Pakete in Java oder C / C ++ auf Android dekodieren

8

Ich arbeite gerade an einem AirPlay-Empfänger für einen Teil einer Android-Anwendung. Ich verwende den folgenden Rahmen:

Ссылка

Obwohl dies bei einigen Mid-Range-Geräten wie dem miPad hervorragend funktioniert, müssen wir dies auf einem speziellen Gerät mit niedriger Spezifikationsrate durchführen. Das benutzerdefinierte Gerät entschlüsselt die Airplay-Pakete 10x bis 20x langsamer als das miPad. Als Ergebnis verlieren die Audiopakete die Zeitsynchronisation und aufgrund der Zeit, die zum Decodieren der Pakete benötigt wird, kann das Audio niemals erneut synchronisieren.

Ich habe mir ein paar andere Airplay-Receiver-Apps im Play Store angeschaut, und von dem, was ich sehe, basieren sie eher auf Shairport ( Ссылка <) / a>) für die Seite des Airplay-Empfängers.

** Hinweis: ** Die auf Shairport basierenden Frameworks scheinen das Synchronisationsproblem auf dem Low-End-Gerät nicht zu erleiden.

Das Framework, das ich verwende, basiert stark auf dem Shairport-Framework, abgesehen davon, dass es in Java geschrieben ist.

Ist C / C ++ zum Dekodieren von Daten weit besser als Java?

Wenn ja, würde ich den Dekodierungsteil des DroidAirPlay-Frameworks über eine C- oder C ++ - Implementierung mit dem NDK anweisen, mir einen großen Leistungsschub zu geben?

Vielen Dank im Voraus

Matt

    
Matthew Cawley 19.07.2016, 10:41
quelle

1 Antwort

0

Es stimmt zwar, dass Java zu Bytecode kompiliert, der in einer virtuellen Maschine ausgeführt wird, aber nicht unbedingt langsamer (oder schneller) als eine nativ kompilierte ausführbare Datei, ob nun C / C ++ oder nicht. Alles hängt vom Programm ab!

Es gibt eine Reihe von Gründen, warum Java in diesem Fall langsamer sein könnte:

  • Die Decodierungsimplementierung könnte nur schlecht codiert / optimiert sein? (was nicht wirklich Javas Schuld ist)
  • Der Java-Compiler generiert möglicherweise einen suboptimalen Code für die JVM.
  • Einige der Sprachkonstrukte von Java sind einfach zu langsam für die Geschwindigkeits- / Ressourcenanforderungen, die hier an sie gestellt werden.
  • Die JVM ist nur eine weitere Abstraktionsschicht und der Schuldige
  • Die Müllsammlung ist drin?!

(Ich muss hier erwähnen, dass ich kein Experte für Java bin!)

Ich würde jedoch immer noch nicht so weit gehen, Java intrinsisch langsamer zu nennen als C oder C ++. Ich bin sicher, dass Sie viele-a-Benchmarks und Tests im Internet finden, die eine Sprache mit einer anderen Sprache vergleichen, und einige machen Ansprüche auf eine bestimmter Grad (aus Stolz und Ego?). Aber diese Tests sind nur spezifische Fälle, in der Regel testen spezifische Aspekte einer größeren Sprache (Hash-Map-Lookup-Leistung zum Beispiel!).

LLVM hatte einen dreiteiligen Blogpost zu C und warum undefiniertes Verhalten es dem Compiler erlaubt, immer noch korrekten, aber effizienteren Code auf Kosten der Laufzeit-Sicherheitsprüfung zu generieren oder zu entscheiden, dass i + 1 immer nach i kommt und die Existenz eines Integer-Überlaufs völlig ignoriert . Wenn der Programmierer nicht vorsichtig ist, kann dies verheerende Folgen haben.

In den Worten von Bjarne selbst in Abstraktion und dem C ++ Maschinenmodell :

  

C ++ wurde entwickelt, um eine Systemprogrammiersprache zu sein und wurde für verwendet   Programmierung eingebetteter Systeme und andere ressourcenbeschränkte Typen von   Programmierung seit den frühesten Tagen.

Ich glaube daher, dass C und C ++ aufgrund dieses undefinierten Verhaltens und weniger Einschränkungen weiter als Java weiterverfolgt werden können. (Und da ist auch das Inline Assembly Bit, aber das ist nicht unbedingt C!)

    
Xunie 29.07.2016 02:03
quelle