7 votes

Performances de fopen() sur win32

J'essaie d'écrire un code qui fonctionne à la fois sous Linux et Win32. La différence la plus notable que je trouve entre eux (dans mon code) est la performance de fopen() .
Le code suivant prend 5 secondes sur mon Ubuntu et le même code prend plus de 100 secondes sur Windows XP. Je tiens à préciser ici qu'Ubuntu est une VM alors que XP est sur une vraie machine.

    time_t start = time(NULL);
    for(int i=0; i < 100000; ++i){
        FILE *fp = fopen("a.txt", "a");
        if (fp != NULL)
        {
            fprintf(fp, "Hello World");
            fclose(fp);
        }
    }
    time_t end = time(NULL);

    printf("\n It took %d seconds \n", end-start);

Clairement fopen() est la cause de cette différence. Je veux savoir pourquoi cette différence est si importante.

0voto

MarkR Points 37178

Je ferais ce qui suit :

  1. Essayez-le sur une machine réelle dont les spécifications sont similaires à celles de la cible visée.
  2. Utilisez la même machine pour les tests Windows et Linux - faites un double démarrage ou autre.
  3. Désactivez tous les modules complémentaires tiers sur la machine Windows, en particulier les logiciels audiovisuels (NB : si le service informatique de votre entreprise ne l'autorise pas, expliquez-leur qu'il s'agit d'une machine de laboratoire de développement de logiciels et qu'elle n'a pas à être soumise à leur politique si elle est convenablement séparée du réseau principal du bureau).

Selon toute vraisemblance, ils ne font pas la même chose. Le système de fichiers est probablement responsable. Soit la machine win32 fait beaucoup plus de vidage - peut-être parce qu'elle a moins de RAM disponible à cause d'autres tâches - soit la machine Linux fonctionne sur du matériel qui simule le vidage et introduit un autre niveau de cache - c'est-à-dire qu'elle triche.

Quel niveau de durabilité exigez-vous dans votre application ? Si les fichiers ne doivent absolument pas disparaître lors d'une panne de courant (par exemple, un serveur de messagerie recevant du courrier), vous devez les fsync(). fclose() ne garantit pas cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X