2016-10-26 2 views
0

Mon programme lit x octets à partir d'un fichier, vérifie s'ils sont tous des zéros, répète le processus pour 20.000 fichiers, et conserve une liste des fichiers qui ont des octets non nulles. En essayant de surveiller les performances, j'ai fait le nombre d'octets qu'il vérifie pour chaque fichier définissable (byteSize). Le problème est que la première exécution du programme prend ~ 5 minutes pour qu'elle se termine (byteSize = 8192), mais si je la relance, cela ne prend que 10 secondes, même si je ferme et redémarre le programme, La seule raison qui me vient à l'esprit est que le tableau d'octets reste en mémoire.BinaryReader 30x plus rapide après la première exécution. Octet tableau toujours en mémoire?

BinaryReader est sous une directive "using", donc pour autant que je sache, il devrait fermer le flux après la fin de la boucle. Alors pourquoi le tableau d'octets reste-t-il? Comment puis-je le supprimer? Je dois le faire pour mesurer les performances réelles chaque fois que je lance le prog.

byte[] readByte = new byte[byteSize]; 

for (int i = 0; i < readCycles; i++) 
{ 
    using (BinaryReader reader = new BinaryReader(new FileStream(file, FileMode.Open, FileAccess.Read))) 
    { 
     reader.BaseStream.Seek(8192 + i * byteSize, SeekOrigin.Begin); 
     reader.Read(readByte, 0, byteSize); 
    } 

    foreach (byte b in readByte) 
    { 
     if (b != 0) 
     { 
      allZeros = false; 
      break; 
     } 
     else 
      allZeros = true; 
    } 

    if (allZeros == false) break; 
} 
+1

Il n'y a aucun moyen que la matrice d'octets soit récupérable de cette manière par votre application après le redémarrage du processus. Peut-être que ce que vous rencontrez est la mise en cache des fichiers du système d'exploitation. – itsme86

+1

Le * tableau * ne reste pas en mémoire (cela ne survit pas aux redémarrages du processus) mais au contenu * fichier *. Windows a son propre cache de système de fichiers pour de telles choses. Créer de nouveaux fichiers pour chaque exécution devrait résoudre cela. –

Répondre

4

Cela a certainement rien à voir avec quoi que ce soit .NET fait - il sera le système de fichiers en cache de façon transparente pour vous.

Pour tester cela, changer votre code à utiliser simplement FileStream et simplement une boucle sur le fichier lu dans une mémoire tampon et en ignorant les données:

using (var stream = File.OpenRead(...)) 
{ 
    var buffer = new byte[16384]; 
    while (stream.Read(buffer, 0, buffer.Length) > 0) 
    { 
    } 
} 

Je suis sûr que vous verrez le même résultat - la première lecture sera relativement lente, alors ce sera très rapide.

+1

Confirmé d'une autre manière: J'ai utilisé SysInternal [RAMMap] (http://technet.microsoft.com/en-us/sysinternals/ff700229.aspx) pour effacer le cache du système d'exploitation et la vitesse est revenue à la première exécution. http://stackoverflow.com/questions/478340/clear-file-cache-to-repeat-performance-testing –