IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Code trop lent pour une écriture sur disque


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 30
    Points : 27
    Points
    27
    Par défaut Code trop lent pour une écriture sur disque
    Bonjour. J'ai voulu faire une sorte de stress test très basique pour mon disque dur, en lui écrivant des données aléatoires en continu, et ça a donné ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    int main(void)	{
     
    	srand((unsigned int)time(NULL)); 
    	unsigned char n = RAND(1,255); // Création d'un nombre aléatoire
    	FILE *fs = NULL;
    	fs = fopen("test1.bin", "wb"); // Ouverture du fichier
    	time_t initial = clock();
    	time_t actual = 0;
     
    	while (actual / CLOCKS_PER_SEC < 120)	{
    		fwrite(&n, 1, 1, fs);	// Ecriture
    		__asm	ror n, 3;		// Rotation
    		actual = clock() - initial;
    	}	// Tant que 120 secondes ne sont pas écoulées, continuer
     
    	fclose(fs);
    	system("pause");
     
    	return 0;
    }
    Le problème, c'est que c'est mon processeur qui se fatigue avant mon HDD (utilisation proc 25%, et c'est un quad core, utilisation HDD 10% pour un 7200 rpm).
    Et ce n'est pas dû à la rotation de l'octet, où au fait de gérer le timer, mais de fwrite qui est trop lent.

    Donc ce que j'aimerais savoir, c'est comment faire pour que l'écriture soit bien plus rapide ? Hormis utiliser les threads parce que il faudra que je lance ce programme sur un ssd donc bon...

    Merci d'avance !

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 402
    Points : 23 785
    Points
    23 785
    Par défaut
    Dans un premier temps, tu peux passer des blocs plus grands que 1 octet à fwrite. Sinon, par définition, tu fais un appel système par octet. C'est extrêmement coûteux. Les flux C sont bufferisés par défaut et les bibliothèques C standards modernes sont également faites pour tamponner les appels systèmes, mais quand même.

    Ensuite ça va surtout dépendre de ton système d'exploitation. C'est lui qui va gérer activement les disques juste après le hardware et il faudra optimiser la programmation système pour influer au minimum sur ses strates.

    Si c'est le débit brut qui t'intéresse, tu peux te tourner vers les raw devices ou ce qui en tient lieu. À part cela, personnellement, je tâcherais d'utiliser mmap() ou assimilé pour faire le plus grand mapping possible dans la mémoire physique, j'utiliserais un pointeur pour modifier un octet en mémoire par intervalles multiples de la taille d'une page afin de « salir » chacune d'elle au moindre coût CPU, et demanderait la synchronisation de tout cela.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 30
    Points : 27
    Points
    27
    Par défaut
    Ok merci de la réponse, j'espère juste que ça ne va pas me bouffer trop de temps ^^.

  4. #4
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 398
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 398
    Points : 20 519
    Points
    20 519
    Par défaut
    salut tu devrais savoir que les entrées/sorties dans un sytème informatique ça ralentit l'exécution des opérations parce que c'est très lent.
    Etant donné que du numérique tu passes à des traitements analogiques.
    En plus il y a le rôle de l'OS que mentionne à juste titre Obsidian.
    La solution de passer des blocs plus gros est valable car effectivement ça sera mis en tampon dans le cache du disque dur

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 906
    Points : 220 167
    Points
    220 167
    Billets dans le blog
    126
    Par défaut
    Bonjour,

    Pour éviter la mise en cache, on peut utiliser fsync, et ouvrir le fichier avec le flag : O_DIRECT de open (c'est assez compliqué à utiliser, car il faut un segment mémoire aligné par rapport aux blocs du disque).
    Après, pour stresser la chose, l'utilisation de OpenMP (pour paralléliser à faible cout en code) est pratique (autant utiliser tous les coeurs).
    Et écrire des bloc de 1 Mo par 1 Mo, c'est mieux aussi.

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 402
    Points : 23 785
    Points
    23 785
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Pour éviter la mise en cache, on peut utiliser fsync, et ouvrir le fichier avec le flag : O_DIRECT de open (c'est assez compliqué à utiliser, car il faut un segment mémoire aligné par rapport aux blocs du disque).
    O_DIRECT est l'interface moderne sous Linux pour gérer les raw devices.

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 906
    Points : 220 167
    Points
    220 167
    Billets dans le blog
    126
    Par défaut
    Vous voyez, j'ai juste

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/10/2008, 21h34
  2. FileCopy trop lent pour l'execution du code
    Par zephirsoul dans le forum VBA Access
    Réponses: 2
    Dernier message: 12/06/2007, 11h44
  3. Gestionnaire d'évènements pour les fichiers sur disque
    Par chourmo dans le forum Composants VCL
    Réponses: 2
    Dernier message: 01/03/2006, 16h18
  4. OpenGL trop lent pour la 2D !!!
    Par kagemusha dans le forum OpenGL
    Réponses: 17
    Dernier message: 14/12/2005, 11h06
  5. [Eclipse] Editeur de code trop lent
    Par Benzeghiba dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 10/11/2005, 14h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo