2009-02-19 8 views
4

Je suis en train de manipuler des fichiers Wave et de les faire lire à partir d'un disque dans un tableau d'octets. Je veux copier rapidement des parties de ce tableau d'octets dans un autre tampon pour le traitement intermédiaire. Actuellement, j'utiliser quelque chose comme ceci:Quel est le moyen le plus rapide de copier mon tableau?

float[] fin; 
byte[] buf; 
//fill buf code omitted 
for(int i=offset; i < size; i++){ 
    fin[i-offset] = (float) buf[i]; 
} 

Je pense que cela est une méthode lente, parce qu'il ya autant de calcul en cours dans la boucle conditionnelle et l'incrément comme il est plus dans le corps même. S'il y avait une copie de bloc disponible en C# ou d'une autre manière, je pourrais mettre en place une copie de bloc, ce serait génial.

Peut-être que ce n'est pas trop lent, mais il semble que beaucoup de travail pour déplacer certaines données. Ici, la "taille" est comprise entre 2^10 et 2^14. Je passe ensuite le "fin" à une bibliothèque FFT, donc ce n'est en aucun cas la partie la plus lente du code, peut-être que j'aboie le mauvais arbre. Je me rends compte que les micro optimisations ne sont pas là où quelqu'un devrait passer son temps, et je réalise que le profilage est une meilleure façon d'atteindre des accélérations dans l'ensemble, mais je sais que ce code est dans un «chemin chaud» et doit être achevée en moins d'un tiers de seconde sur différentes architectures de l'utilisateur final afin de minimiser les exigences de notre système matériel. Même si je sais que le code FFT suivant prendra beaucoup plus de temps, je cherche des accélérations où je peux les obtenir.

Array.Copie semble très bien, je ne savais pas à ce sujet avant, et je considère que ce Q & A un succès déjà!

Répondre

12

Il y a aussi:

Array.Copy 
Array.CopyTo 

mais si ce sera plus rapide nécessitera le profilage. Mais attention à la mise au point sur les micro-optimisations dans la mesure où vous manquez la grande image, sur les PC modernes, l'effet de la mise en mémoire cache à plusieurs niveaux est susceptible d'être supérieur à une approche ou une autre à la copie.

Editer: Réflecteur de vérification rapide: les deux méthodes ci-dessus se résument à une implémentation native commune (bonne).

Notez que les documents pour Array.Copy couvrent les conversions de type valides, une conversion de valeur -> valeur d'élargissement comme octet à float doit être OK.

1

Je ne ferai pas référence à knuth mais je profilerai votre code. Mettez des horodateurs et mesurez combien de temps cela prend. Ensuite, vous pouvez passer votre temps dans l'optimisation bien :)

3

Jetez un oeil à Array.Copy il devrait être plus rapide

3

Puisque vous convertissez de l'octet pour vous flotter ne va pas se speedup significative. Aucun Array.Copy ou une variation de memcopy peut faire face à cela.

Le seul gain possible serait de "piquer" la valeur de l'octet dans un flotteur. Je ne sais pas assez (sur la mise en œuvre de float) pour savoir si ça va marcher et honnêtement je ne veux pas non plus savoir.

+0

Oui, sous MS.NET Framework, je ne pense pas que nous devrions piquer des bits sous un flotteur :) – Karl

Questions connexes