Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1635 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

De la lenteur de string avec BC++ 5 et d'un algo de m*** en general ..

n°212929
Joel F
Real men use unique_ptr
Posté le 12-09-2002 à 14:59:54  profilanswer
 

Reprise du message précédent :
Moi y en a compris mais moi y en apenser ca pas rapidos paske
disque bien lent itou

mood
Publicité
Posté le 12-09-2002 à 14:59:54  profilanswer
 

n°212936
LetoII
Le dormeur doit se réveiller
Posté le 12-09-2002 à 15:03:28  profilanswer
 

Joel F a écrit a écrit :

Moi y en a compris mais moi y en apenser ca pas rapidos paske
disque bien lent itou




 
Ben faut essayer bouana
 
Puis tu peux mapper le fichier éventuellement  :ange:


---------------
Le Tyran
n°213037
BENB
100% Lux.
Posté le 12-09-2002 à 16:17:08  profilanswer
 

Joel F a écrit a écrit :

Moi y en a compris mais moi y en apenser ca pas rapidos paske
disque bien lent itou




Le disque oui mais sont cache oui...
Or sur les disques actuels tu as 2 ou 4 Mo de cache...
Sans compter le systeme...
 
Donc tes 400 ko...
 

n°213462
Musaran
Cerveaulté
Posté le 13-09-2002 à 01:56:55  profilanswer
 

Joel F a écrit a écrit :

Code :
  1. string += "\0"




Sans vouloir être offensant, ceci est une double stupidité.
1)
\0 termine prématurément la chaîne littérale, qui se retrouve de longueur nulle.
Donc on concatène... rien !
'\0' n'est pas seulement mieux, c'est indispensable !
 
2)
Comment les opérations de chaînes sont-elles sensées se comporter quand celles-ci sont truquées avec des terminateurs en plein milieu ?
A tout les coups c'est indéfini !
 
C'est pas une chaîne que tu construit, c'est un buffer...
 
Fait plutôt un truc du genre:

Code :
  1. #include <fstream.h>
  2. ofstream fout("machin.dat" );
  3. fout <<  chaine_cle[i] << '\0' << chaine_valeur[i] << '\0';


 
Il y a peut-être moyen de construire des 'string' sans copie (non testé):

Code :
  1. #include <strstrea.h>
  2. char* debut= ...;
  3. istrstream strcopyless( debut, longueur);
  4. istrstream strcopyless( debut); //si 'debut' est une chaîne C valide


 
Il doit bien y avoir moyen de géger tout ça sans copies inutiles, et sans faire à la sauce C: tout en char*.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°213515
Joel F
Real men use unique_ptr
Posté le 13-09-2002 à 09:53:43  profilanswer
 

Ah mon brave musaran je te le fait pas dire que c stupide ...
Si j'y pouvais qqchose ...
 
Enfin, pour les courageux :
 

Code :
  1. bool TBLFile::save( const char* filename )
  2. {
  3.     bool            result;
  4.     unsigned long   numberofmisses;
  5.     unsigned long   hashvalue;
  6.     unsigned short  hashoffset;
  7.     unsigned short* hashIndices;
  8.     TBLPAIRHEADER*  nodes;
  9.     unsigned char*  define;
  10.     FILE*           file;
  11.     if( header )
  12.     {
  13.         AnsiString      allstring;
  14.         unsigned short  size                    = values.size();
  15.         unsigned long   stringoffset            = 21 + 19*size;
  16.         unsigned long   highestnbrofmisses      = 0;
  17.         unsigned long   strsize                 = 0;
  18.         hashIndices = new unsigned short[size];
  19.         nodes       = new TBLPAIRHEADER[size];
  20.         define      = new unsigned char[size];
  21.         memset( define, 0, size );
  22.         for( int j = 0; j < size; j++ )
  23.         {
  24.             strsize += values[j]->key.length();
  25.             strsize += values[j]->value.length();
  26.         }
  27.         strsize += 2*size;
  28.         allstring.SetLength( strsize );
  29.         allstring = "";
  30.         for( int i = 0; i < size; i++ )
  31.         {
  32.             numberofmisses = 0;
  33.        
  34.             // No time influence.
  35.             //
  36.             hashvalue      = hash( values[i]->key.c_str(), size );
  37.             hashoffset     = hashvalue;
  38.             // No time influence.
  39.             //
  40.             while( define[hashoffset] != 0 )
  41.             {
  42.                 numberofmisses++;
  43.                 hashoffset++;
  44.                 hashoffset %= size;
  45.             }
  46.             highestnbrofmisses = ( numberofmisses > highestnbrofmisses ? numberofmisses : highestnbrofmisses );
  47.             hashIndices[i] = hashoffset;
  48.             define[hashoffset] = 1;
  49.             nodes[hashoffset].used           = 1;
  50.             nodes[hashoffset].dummy          = i;
  51.             nodes[hashoffset].hashNbr        = hashvalue;
  52.             nodes[hashoffset].keyOffset      = stringoffset + allstring.Length();
  53.             allstring += values[i]->key.c_str();
  54.             allstring += '\0';
  55.             nodes[hashoffset].stringOffset   = stringoffset + allstring.Length();;
  56.             nodes[hashoffset].strlength      = values[i]->value.length()+1;
  57.             allstring += values[i]->value.c_str();
  58.             allstring += '\0';
  59.         }
  60.         file = fopen( filename, "wb" );
  61.         header->CRC         = CRC( allstring );
  62.         header->numElts     = (unsigned short)size;
  63.         header->hashSize    = size;
  64.         header->unknown     = 1;
  65.         header->indexStart  = stringoffset;
  66.         header->missNbr     = highestnbrofmisses + 1;
  67.         header->indexEnd    = stringoffset + allstring.Length();
  68.         if( file )
  69.         {
  70.             fwrite( header, 1, 21, file );
  71.             fwrite( hashIndices, 1, 2*size, file);
  72.             fwrite( nodes, 1, 17*size, file );
  73.             fwrite( allstring.c_str(), 1, allstring.Length(), file );
  74.             fclose( file );
  75.             result = true;
  76.         }
  77.         else
  78.         {
  79.             result = false;
  80.         }
  81.         delete[] nodes;
  82.         delete[] define;
  83.         delete[] hashIndices;
  84.     }
  85.     else
  86.     {
  87.         result = false;
  88.     }
  89.     return result;
  90. }


 
je vous fait grace des acrobaties arithmetiques des fonctions hash et CRC.
 
Les commentaires // No time influence montre les endroits ou je suis sur que c pas ca qui rame.
 
V essayer s'titoire de buffer.
 
PS : le truc du char* deja essayer ... donne pas mieux :(

n°213533
taureau
Posté le 13-09-2002 à 10:13:39  profilanswer
 

c quoi le type de values ? c'est peut-etre cet accès qui est "lent" ...

n°213535
LetoII
Le dormeur doit se réveiller
Posté le 13-09-2002 à 10:14:47  profilanswer
 

Taureau a écrit a écrit :

c quoi le type de values ? c'est peut-etre cet accès qui est "lent" ...




 
je crois que c string


---------------
Le Tyran
n°213537
Joel F
Real men use unique_ptr
Posté le 13-09-2002 à 10:17:27  profilanswer
 

Code :
  1. struct TBLPAIR
  2. {
  3.    string key;
  4.    string value;
  5. };
  6. TBLPAIR*  values;

n°214177
Musaran
Cerveaulté
Posté le 14-09-2002 à 00:55:22  profilanswer
 

Non, j'ai pas le courage.
 
Tu devrais utiliser le même type de chaînes partout, les copies seraient peut-être plus rapides.
key.c_str(); Le tout petit truc gros bouffeur: il force l'ajout d'un '\0', ce qui peut mener à une réallocation.
 
La copie, l'allocation, la conversion de format et la construction par étapes sont des bouffeurs de performances, il faut les éviter.
Coupe toutes ces étapes, elles ne sont pas fondamentalement nécessaires.
C'est tout ce que j'ai à en dire.
 

Joel F a écrit a écrit :

PS : le truc du char* deja essayer ... donne pas mieux :(


Qu'as-tu essayé exactement ?


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°214922
Joel F
Real men use unique_ptr
Posté le 16-09-2002 à 09:59:06  profilanswer
 

utiliser char* comme type pour stocker mes chaines et faire du memcpy pour recopier les trucs.
 
Sinon, g tout reecrit en utilisant AnsiString, ca va 1 peu mieux, je gagne encore 15% de perf (surement ces histoires de transformation).
 
V encore essayez de simplifier le truc. Merci encore

mood
Publicité
Posté le 16-09-2002 à 09:59:06  profilanswer
 

n°220323
Musaran
Cerveaulté
Posté le 26-09-2002 à 02:05:46  profilanswer
 

J'ai une précision:
Les std::string peuvent bien contenir '\0' comme caractère valide.

Code :
  1. string::data() //pointeur sur le premier caractère.
  2. string::size() //longueur.


Si la fonction CRC était basée la-dessus, cela éviterait de forcer l'ajout d'un '\0' terminal.
 
Edit: c'est le forum qui met une majuscule à data, pas moi.


Message édité par Musaran le 26-09-2002 à 02:07:54

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
eingénierie et programmation en général ![ALGO] les grand mondes .....
algo deplacements[PHP] aide avec une fonction de rajout de dates / string
[Java] Remplacer un string par un string (Résolu)convertir un prog java en algo ?
[Algo] Faire un fondu entre 2 images...[vb] utiliser un string pour un nom de fichier
Un algo de tri, oui mais avec Iterator[Algo] un site sur la syntaxe algorithmique ?
Plus de sujets relatifs à : De la lenteur de string avec BC++ 5 et d'un algo de m*** en general ..


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR