2010-05-17 6 views
1

J'ai un programme écrit en C++, qui ouvre un fichier binaire (test.bin), le lit objet par objet, et place chaque objet dans un nouveau fichier (il ouvre le nouveau fichier, écrit dedans (append), et le ferme). J'utilise fopen/fclose, fread et fwrite. test.bin contient 20 000 objets.Le programme C++ s'exécute lentement dans VS2008

Ce programme tourne sous linux avec g ++ en 1 sec mais en VS2008 en mode debug/release en 1min!

Il y a des raisons pour lesquelles je ne les fais pas par lots ou ne les garde pas en mémoire ou toute autre sorte d'optimisations.

Je me demande juste pourquoi il est si lent sous Windows.

Merci,

+6

Que vous dit votre profileur? –

+0

Dupliquer (même utilisateur): http://stackoverflow.com/questions/2831039/visual-studio-2008-awful-performance –

+1

Peut-être le débogage nouveau et la vérification de code libre ... mais vous pouvez le profiler. Qu'est-ce qui se passe sous la libération? – Tim

Répondre

3

Malheureusement, l'accès aux fichiers sous Windows n'est pas réputé pour sa rapidité, surtout si vous ouvrez beaucoup de fichiers et ne lisez et écrivez que de petites quantités de données. Pour de meilleurs résultats, la solution (pas particulièrement utile) consisterait à lire de grandes quantités de données à partir d'un petit nombre de fichiers. (Ou passer à Linux entièrement pour ce programme ?!)

Autres suggestions au hasard pour essayer:

  • désactiver le correcteur de virus si vous en avez un (j'ai Kaspersky sur mon PC, et écrire 20 000 les fichiers rapidement ont conduite les bananes)
  • utiliser un disque NTFS si vous avez un (FAT32 sera encore pire)
  • assurez-vous de ne pas utiliser accidentellement en mode texte avec fopen (facile à faire)
  • utilisation setvbuf pour augmenter la taille du tampon pour chaque FILE
  • essayez CreateFile/ReadFile/etc. au lieu de fopen et les amis, qui ne résoudra pas votre problème, mais peut raser quelques secondes du temps d'exécution (puisque les fonctions stdio font un peu de travail supplémentaire que vous n'avez pas besoin probablement)
+0

C'était McAfee Antivirus !! chaque fois qu'il essayait de scanner le fichier :)) Merci :) – Nima

4

Je crois que lorsque vous fermez un fichier dans Windows, il vide le contenu sur le disque à chaque fois. Sous Linux, j'ai don't think that is the case. Le flush sur chaque opération serait très coûteux.

+0

Alors, comment puis-je configurer windows pour travailler les sames comme linux? – Nima

+0

@Nima: Avant même que vous posiez cette question, j'avais cherché des informations sur la façon d'y parvenir. Je n'ai pas été capable de trouver un mécanisme évident pour imiter ce comportement. –

+0

merci :) oui, moi non plus. Je pense que la meilleure chose à faire est d'écrire un wrapper pour un fichier, et implémenter les politiques de mise en cache implicitement. – Nima

0

Je pense qu'il n'est pas question de VS 2008. Il est question de différences entre les systèmes de fichiers Linux et Windows. Et comment C++ fonctionne avec les fichiers dans les deux systèmes.

0

Je Je vois beaucoup de devinettes ici.

Vous utilisez l'IDE VS2008. Vous pouvez toujours utiliser le "profileur du pauvre" et de trouver exactement ce qui se passe.

Dans cette minute, appuyez sur le bouton "pause" et regardez ce qu'il fait, y compris la pile des appels. Faites ceci plusieurs fois. Chaque pause est presque certaine (Prob = 59/60) pour l'attraper en faisant exactement ce qu'il ne fait pas sous Linux.

Questions connexes