Ajoutant ArrayBuffers
Quelle est la meilleure façon d'ajout/combinant ArrayBuffers?
Je suis de la réception et de l'analyse des paquets réseau avec une variété de structures de données. Les messages entrants sont lus dans ArrayBuffers. Si partielle d'un paquet arrive j'ai besoin de la stocker et attendez le message suivant avant de re-tenter de l'analyser.
Actuellement, je suis en train de faire quelque chose comme ceci:
function appendBuffer( buffer1, buffer2 ) {
var tmp = new Uint8Array( buffer1.byteLength + buffer2.byteLength );
tmp.set( new Uint8Array( buffer1 ), 0 );
tmp.set( new Uint8Array( buffer2 ), buffer1.byteLength );
return tmp.buffer;
}
Évidemment, vous ne pouvez pas l'obtenir autour de les avoir à créer un nouveau tampon de ArrayBuffers sont d'une longueur fixe, mais est-il nécessaire d'initialiser les tableaux typés? À l'arrivée, je veux juste être capable de traiter les tampons, comme les tampons, les types et les structures ne sont pas préoccupants.
- double possible de Tableaux Typés dans Gecko 2: Float32Array de concaténation et d'extension
- la solution à la question ci-dessus vous propose mon approche actuelle qui est de combiner tableaux typés dans un nouveau tampon. Ce qui est bien quand vous voulez traiter avec des tableaux typés. Je veux les éviter complètement. Ma question est de savoir si c'est possible.
- eh bien, vous n'avez
.slice
avecArrayBuffer
, pas beaucoup peut être fait avec qui. Ensuite, vous avez.append
avecBlobBuilder
mais ça va être beaucoup plus compliqué que ce que vous faites déjà. Est-il un vrai problème avec votre approche? - mon problème est le rendement, même si je n'ai pas atteint ce point est de tester encore. Cela semblait juste comme un moyen détourné de le faire. Encore à m'habituer à JS! Merci quand même.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez toujours utiliser
DataView
(http://www.khronos.org/registry/typedarray/specs/latest/#8) plutôt que sur un tableau typé, mais, comme il a été mentionné dans les commentaires à votre question, vous ne pouvez pas faire grand chose avecArrayBuffer
sur son propre.Pourquoi pas à l'aide d'un Blob ? (Je me rends compte qu'il n'aurait pas été disponible à ce moment).
Il suffit de créer un Blob avec vos données, comme
var blob = new Blob([array1,array2,string,...])
et les transforment en un ArrayBuffer (si nécessaire) à l'aide d'un FileReader (voir cette).Vérifier : Quelle est la différence entre BlobBuilder et le nouveau Blob constructeur?
Et ceci : MDN Blob API
EDIT :
J'ai voulu comparer l'efficacité de ces deux méthodes (Gouttes, et la méthode utilisée dans la question) et créé un JSPerf : http://jsperf.com/appending-arraybuffers
Semble à l'aide de Gouttes est plus lent (En fait, je suppose que c'est l'utilisation de Filereader lire la Goutte qui prend le plus de temps). Alors maintenant, vous savez 😉
Peut-être qu'il me serait plus efficace quand il y a plus de 2 ArrayBuffer (comme la reconstruction d'un fichier à partir de ses morceaux).
Il semble que vous avez déjà conclu qu'il n'y a pas moyen de contourner la création d'un nouveau tableau de la mémoire tampon. Toutefois, par souci de performance, il pourrait être utile d'ajouter le contenu de la mémoire tampon à une gamme standard de l'objet, puis créer un nouveau tableau tampon ou tableau typé de que.
La plupart des moteurs javascript va déjà avoir un espace réservé pour la mémoire allouée dynamiquement. Cette méthode va utiliser l'espace au lieu de créer de nombreuses nouvelles allocations de mémoire, qui peut être une performance tueur à l'intérieur du noyau du système d'exploitation. En plus de cela, vous aurez aussi la raser quelques appels de fonction.
Un deuxième, plus impliqués option serait d'allouer de la mémoire à l'avance.
Si vous connaissez la taille maximale d'un flux de données vous pouvez créer un tableau de la mémoire tampon de taille, le remplir (en partie si nécessaire), puis la vider une fois terminé.
Enfin, si la performance est votre objectif principal, et vous savez que la taille de paquet maximale (au lieu de l'ensemble du flux de déchets), puis commencer à sortir avec une poignée de tableau de tampons de cette taille. Tant que vous remplissez votre pré-alloué de la mémoire, de créer de nouveaux tampons entre les appels de réseau -- de manière asynchrone, si possible.