Quelle est la meilleure taille de mémoire tampon à allouer pour télécharger un fichier depuis Internet?

Quelle est la meilleure taille de mémoire tampon à allouer pour télécharger un fichier depuis Internet? Certains des échantillons ont dit qu’il devrait être 1K. Eh bien, j’ai besoin de savoir en général pourquoi est-ce? Et aussi quelle est la différence si nous téléchargeons un petit .PNG ou un gros .AVI ?

 Stream remoteStream; Stream localStream; WebResponse response; try { response = request.EndGetResponse(result); if (response == null) return; remoteStream = response.GetResponseStream(); var localFile = Path.Combine(FileManager.GetFolderContent(), TaskResult.ContentItem.FileName); localStream = File.Create(localFile); var buffer = new byte[1024]; int bytesRead; do { bytesRead = remoteStream.Read(buffer, 0, buffer.Length); localStream.Write(buffer, 0, bytesRead); BytesProcessed += bytesRead; } while (bytesRead > 0); } 

Utilisez au moins 4Ko. C’est la taille de page normale pour Windows (c’est-à-dire la granularité à laquelle Windows gère elle-même la mémoire), ce qui signifie que l’allocateur de mémoire .Net n’a pas besoin de décomposer une page de 4 Ko en allocations de 1 Ko.

Bien sûr, utiliser un bloc de 64 Ko sera plus rapide, mais seulement de manière marginale.

Pour ce que ça vaut, j’ai testé la lecture d’un fichier texte de 1484 Ko en utilisant des puissances progressives de deux (tailles de 2,4,8,16 …). J’ai imprimé sur la fenêtre de la console le nombre de millisecondes requirejs pour lire chacune d’elles. Une bonne partie des années 802 passées, cela ne semblait pas beaucoup changer. Voici les résultats sur ma machine Windows 7 64 bits.

 2^1 = 2 :264.0151 2^2 = 4 :193.011 2^3 = 8 :175.01 2^4 = 16 :153.0088 2^5 = 32 :139.0079 2^6 = 64 :134.0077 2^7 = 128 :132.0075 2^8 = 256 :130.0075 2^9 = 512 :133.0076 2^10 = 1024 :133.0076 2^11 = 2048 :90.0051 2^12 = 4096 :69.0039 2^13 = 8192 :60.0035 2^14 = 16384 :56.0032 2^15 = 32768 :53.003 2^16 = 65536 :53.003 2^17 = 131072 :52.003 2^18 = 262144 :53.003 2^19 = 524288 :54.0031 2^20 = 1048576 :55.0031 2^21 = 2097152 :54.0031 2^22 = 4194304 :54.0031 2^23 = 8388608 :54.003 2^24 = 16777216 :55.0032 

2k, 4k ou 8k sont de bons choix. Peu importe la taille de la page, le changement de vitesse serait vraiment marginal et imprévisible.

Tout d’abord, la mémoire C # peut être déplacée, C # utilise un ramasse-miettes générationnel compactant. Il n’y a aucune sorte d’information sur l’endroit où les données seront allouées.

Deuxièmement, les tableaux en C # peuvent être formés par des zones de mémoire non contiguës! Les tableaux sont stockés de manière contiguë dans la mémoire virtuelle, mais mémoire virtuelle contiguë ne signifie pas mémoire physique contiguë.

Troisièmement, la structure de données de tableau en C # occupe certains octets plus que le contenu lui-même (elle stocke la taille du tableau et d’autres informations). Si vous allouez un nombre d’octets de la taille de la page, l’utilisation du tableau changera de page presque toujours!

Je penserais que l’optimisation du code en utilisant la taille de la page peut être une non-optimisation.

Généralement, les tableaux C # fonctionnent très bien, mais si vous avez vraiment besoin d’une allocation précise des données, vous devez utiliser des tableaux épinglés ou Marshal, mais cela ralentira le ramasse-miettes.

L’utilisation de l’allocation de marshal et du code non sécurisé peut être un peu plus rapide, mais cela ne vaut vraiment pas la peine.

Je dirais qu’il est préférable d’utiliser vos tableaux sans trop réfléchir à la taille de la page. Utilisez des tampons 2k, 4k ou 8k.

J’ai un problème avec la connexion de fermeture de la machine distante lors de l’utilisation du tampon 64K lors du téléchargement à partir d’IIS.

J’ai résolu le problème en élevant le tampon à 2M

Dans certains cas, vous pouvez connaître (ou savoir, ou bidouiller dans un débogueur et donc déterminer, même si cela ne résiste pas au changement), la taille d’un tampon utilisé par le ou les stream que vous écrivez ou lisez. . Dans ce cas, cela donnera un léger avantage si vous correspondez à cette taille, ou à défaut, qu’un tampon soit un multiple entier de l’autre.

Sinon, 4096 sauf si vous avez une autre raison (vouloir un petit tampon pour donner un retour rapide de l’interface utilisateur par exemple), pour les raisons déjà données.