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

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4
Auteur Sujet :

[Concours No 3] A vos cerveaux !

n°774174
Evadream -​jbd-
Posté le 23-06-2004 à 12:44:58  profilanswer
 

Reprise du message précédent :


 
[:ddr555]

mood
Publicité
Posté le 23-06-2004 à 12:44:58  profilanswer
 

n°774176
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 23-06-2004 à 12:48:49  profilanswer
 

si je le fais en assembleur, en RING 0, et avec une mesure de temps à base de RDTSC, je suis dans les clous du concours ou pas ? :whistle:

n°774178
the real m​oins moins
Posté le 23-06-2004 à 12:49:57  profilanswer
 

tant que tu n'essaies pas de poster tes résultats sur le forum avec ton soft ...


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°774180
printf
Baston !
Posté le 23-06-2004 à 12:51:01  profilanswer
 

Drapooooo.


---------------
Un matin je me lèverai et il fera beau.
n°774188
R3g
fonctionnaire certifié ITIL
Posté le 23-06-2004 à 13:06:09  profilanswer
 

Dites c'est sympa votre truc mais on juge quoi là ? parce que si le but c'est de faire du code rapide, ce serait peut-être une bonne idée de comparer les programmes avec le même compilo et sur la même machine, histoire que ça veuille dire quelquechose ?


---------------
Au royaume des sourds, les borgnes sont sourds.
n°774225
christophe​_d13
L'efficacité à tout prix.
Posté le 23-06-2004 à 13:44:32  profilanswer
 

Harkonnen> T'es pas obligé d'être en Ring0 pour faire RDTSC.
R3g> Relis ce que j'ai posté au début du topic. Une fois que tout le monde aura posté ses codes, je pourrais faire les comparaisons.

n°774240
NeKoFuchik​oma
Posté le 23-06-2004 à 13:58:21  profilanswer
 

Salut  :hello:  
 
Compilé avec g++, j'arrive à descendre jusqu'a 460 en release sur mon portable (Centrino P4m 1.3Ghz donc un cache L2 de 1024Ko) et seulement 1562 avec Visual 7.1  :sweat: .
Mais bon j'ai déroulé un peu la boucle principale pour réduire le nombre de test du for :) et je vous passe le temps de compilation Enorme  :sleep:  
 
 
A+
:: NeKo ::
 

n°774274
christophe​_d13
L'efficacité à tout prix.
Posté le 23-06-2004 à 14:14:24  profilanswer
 

J'ai encore un peu progressé...
 
Release : J'arrive en pointe à 234ms et 250ms de façon régulière.
Debug : J'arrive à 984ms.
 
Voici le code :

Code :
  1. // ConcoursHFR03.cpp : Defines the entry point for the console application.
  2. //
  3. #include <windows.h>
  4. #include <stdio.h>
  5. #include <conio.h>
  6. #include <stdlib.h>
  7. #include <malloc.h>
  8. #define MACRO_CHIFFRE_DIV10(x,y)   y = x/10; \
  9.                                    lReste = x - ((y<<3)+(y<<1)); \
  10.                                    lTableauResultatOccurences[lReste]++;
  11. #define MACRO_CHIFFRE_LUT10(x,y)    y = plDivideBy10[x]; \
  12.                                     (*plReste[x])++;
  13.                                  
  14. int main ( int argc, char * argv[] )
  15. {
  16.     long i, j, lValue, lTestLoop;
  17.     long lTableauResultatOccurences[10];
  18.     long lReste;
  19.     long lRenaming1, lRenaming2;
  20.     DWORD dwTC1, dwTC2;
  21.     long *plDivideBy10;
  22.     long **plReste;
  23.     //Boucle pour tester plusieurs fois l'algo
  24.     for (lTestLoop=0;lTestLoop<20;lTestLoop++)
  25.     {
  26.         //Uniquement sous Visual C++
  27.         dwTC1 = GetTickCount ( );
  28.         //Initialisation des deux LUT (80Ko en mémoire... Une partie est dans le cache L1, le reste dans le L2)
  29.         plDivideBy10    = (long  *)malloc ( (10000 * sizeof(long)) + (10000 * sizeof(long *)) );
  30.         plReste         = (long **)&(plDivideBy10[10000]);
  31.         for (i=0;i<10000;)
  32.         {
  33.             j = i/10;
  34.             for (lValue=0;lValue<10;lValue++,i++)
  35.             {
  36.                 plDivideBy10[i] = j;
  37.                 plReste[i] = &lTableauResultatOccurences[lValue];
  38.             }
  39.         }
  40.         memset ( lTableauResultatOccurences, 0, sizeof(lTableauResultatOccurences) );
  41.         for (i=0,lValue=0;i<5000000;i++)
  42.         {
  43.             lValue = ( ( 1664525 * lValue ) + 1013904223 ) & 0x7FFFFFFF;
  44.        
  45.             if (lValue>=1000000000)
  46.             {
  47.                 //Si le nombre est de 10 chiffres (53,5% des cas)
  48.                 MACRO_CHIFFRE_DIV10(lValue,lRenaming2);
  49.                 MACRO_CHIFFRE_DIV10(lRenaming2,lRenaming1);
  50.                 MACRO_CHIFFRE_DIV10(lRenaming1,lRenaming2);
  51.                 MACRO_CHIFFRE_DIV10(lRenaming2,lRenaming1);
  52.                 MACRO_CHIFFRE_DIV10(lRenaming1,lRenaming2);
  53.                 MACRO_CHIFFRE_DIV10(lRenaming2,lRenaming1);
  54.                 MACRO_CHIFFRE_LUT10(lRenaming1,lRenaming2);
  55.                 MACRO_CHIFFRE_LUT10(lRenaming2,lRenaming1);
  56.                 MACRO_CHIFFRE_LUT10(lRenaming1,lRenaming2);
  57.                 MACRO_CHIFFRE_LUT10(lRenaming2,lRenaming1);
  58.             }
  59.             else if (lValue>=100000000)
  60.             {
  61.                 //Si le nombre est de 9 chiffres (41,9% des cas)
  62.                 MACRO_CHIFFRE_DIV10(lValue,lRenaming2);
  63.                 MACRO_CHIFFRE_DIV10(lRenaming2,lRenaming1);
  64.                 MACRO_CHIFFRE_DIV10(lRenaming1,lRenaming2);
  65.                 MACRO_CHIFFRE_DIV10(lRenaming2,lRenaming1);
  66.                 MACRO_CHIFFRE_DIV10(lRenaming1,lRenaming2);
  67.                 MACRO_CHIFFRE_LUT10(lRenaming2,lRenaming1);
  68.                 MACRO_CHIFFRE_LUT10(lRenaming1,lRenaming2);
  69.                 MACRO_CHIFFRE_LUT10(lRenaming2,lRenaming1);
  70.                 MACRO_CHIFFRE_LUT10(lRenaming1,lRenaming2);
  71.             }
  72.             else
  73.             {
  74.                 //Si le nombre occupe jusqu'à 8 chiffres (4,6% des cas)
  75.                 MACRO_CHIFFRE_DIV10(lValue,lRenaming2);
  76.                 if (!lRenaming2) continue;
  77.                 MACRO_CHIFFRE_DIV10(lRenaming2,lRenaming1);
  78.                 if (!lRenaming1) continue;
  79.                 MACRO_CHIFFRE_DIV10(lRenaming1,lRenaming2);
  80.                 if (!lRenaming2) continue;
  81.                 MACRO_CHIFFRE_DIV10(lRenaming2,lRenaming1);
  82.                 if (!lRenaming1) continue;
  83.                 MACRO_CHIFFRE_LUT10(lRenaming1,lRenaming2);
  84.                 if (!lRenaming2) continue;
  85.                 MACRO_CHIFFRE_LUT10(lRenaming2,lRenaming1);
  86.                 if (!lRenaming1) continue;
  87.                 MACRO_CHIFFRE_LUT10(lRenaming1,lRenaming2);
  88.                 if (!lRenaming2) continue;
  89.                 MACRO_CHIFFRE_LUT10(lRenaming2,lRenaming1);
  90.             }
  91.         }
  92.         free ( plDivideBy10 );
  93.         //Uniquement sous Visual C++
  94.         dwTC2 = GetTickCount ( );
  95.         printf ( "Durée de traîtement : %d ms\n", dwTC2 - dwTC1 );
  96.     }
  97.     for (i=0;i<10;i++)
  98.     {
  99.         printf ( "%d - %d occurence", i, lTableauResultatOccurences[i] );
  100.         if (lTableauResultatOccurences[i]>1) printf ( "s" );
  101.         printf ( "\n" );
  102.     }
  103. return 0;
  104. }


Message édité par christophe_d13 le 23-06-2004 à 14:17:22
n°774289
NeKoFuchik​oma
Posté le 23-06-2004 à 14:22:14  profilanswer
 

Tres jolie  :jap:  
 
A+
:: NeKo ::

n°774291
christophe​_d13
L'efficacité à tout prix.
Posté le 23-06-2004 à 14:23:49  profilanswer
 

Neko> Peux-tu l'essaye sur ta machine ?

mood
Publicité
Posté le 23-06-2004 à 14:23:49  profilanswer
 

n°774301
NeKoFuchik​oma
Posté le 23-06-2004 à 14:29:43  profilanswer
 

christophe> au plus bas je tombe à 361 avec ton code. Bravo :D  c'est plutot futé l'optimisation en fonction des stats de sortie.  :jap:  
 
A+
:: NeKo ::


Message édité par NeKoFuchikoma le 23-06-2004 à 14:30:30
n°774325
christophe​_d13
L'efficacité à tout prix.
Posté le 23-06-2004 à 14:43:50  profilanswer
 

J'espère que d'autres feront mieux.
Ce que je peux dire, c'est que ceux qui ont la critique facile ne font produisent pas grand chose. Alors au lieu de causer, réfléchisser !


Message édité par christophe_d13 le 23-06-2004 à 14:57:51
n°774382
Flyounet_5​7
difficile à dire :/
Posté le 23-06-2004 à 15:20:01  profilanswer
 

avec ton code christophe_d13 j'ai 765ms au plus bas, avec un Athlon XP 1700+


Message édité par Flyounet_57 le 23-06-2004 à 15:20:38
n°774397
christophe​_d13
L'efficacité à tout prix.
Posté le 23-06-2004 à 15:25:43  profilanswer
 

Flyounet_57> C'est un peu logique, ton bus est à 133MHz, et tu as une fréquence inférieure (le cache est normalement ok). En calculant grosso modo les perfs, tu dois être à 350ms. Bizarre...
Quel est ton compilateur ? Version ? OS ?
 
J'ai hésité à mettre mon code... J'aurais dû attendre plus longtemps que chacun ponde avec ses idées.

n°774438
darkoli
Le Petit Dinosaure Bleu
Posté le 23-06-2004 à 15:43:46  profilanswer
 

christophe_d13 a écrit :

Flyounet_57> C'est un peu logique, ton bus est à 133MHz, et tu as une fréquence inférieure (le cache est normalement ok). En calculant grosso modo les perfs, tu dois être à 350ms. Bizarre...
Quel est ton compilateur ? Version ? OS ?
 
J'ai hésité à mettre mon code... J'aurais dû attendre plus longtemps que chacun ponde avec ses idées.

Honnêtement je sèche, je n'ai pas d'idées (à par celle de lire le dernier chiffre et de faire ensuite un décalage).

n°774601
christophe​_d13
L'efficacité à tout prix.
Posté le 23-06-2004 à 17:09:11  profilanswer
 

Pour ma part, j'ai mes petites idées...

n°774647
Flyounet_5​7
difficile à dire :/
Posté le 23-06-2004 à 17:43:48  profilanswer
 

christophe_d13 a écrit :

Flyounet_57> C'est un peu logique, ton bus est à 133MHz, et tu as une fréquence inférieure (le cache est normalement ok). En calculant grosso modo les perfs, tu dois être à 350ms. Bizarre...
Quel est ton compilateur ? Version ? OS ?


OS : Win Xp Famille
j'ai compilé via DevC++ 4.9.8.0 donc c'est Mingw  
et j'avais rien qui tournait en même temps
je retesterais direct apres un reboot tout à l'heure pour voir

n°774650
christophe​_d13
L'efficacité à tout prix.
Posté le 23-06-2004 à 17:49:31  profilanswer
 

darkoli> Il y a un moyen de se passer de la division par 10 et de son reste. Le problème, c'est en C/C++ il faut forcément deux opérations, alors qu'en ASM, une seule suffit. Faut cogiter...

n°774840
blackgodde​ss
vive le troll !
Posté le 23-06-2004 à 20:32:35  profilanswer
 

puisqu'on a pas parlé du temps de compilation, voici une solution avec des teamplates. J'ai essayé pour 1000, le temps est à 0 ms avec ma 1ere solution comme avec celle-ci.
par contre deja pour 1000, le temps de compilation est tres long. je ne sais pas si c'est compilable pour les 5000000...
qu'en pensez-vous ?
 

Code :
  1. #include <iostream>
  2. #include <windows.h>
  3. using namespace std;
  4. #define tab_param int tab0, int tab1, int tab2, int tab3, int tab4, int tab5, int tab6, int tab7, int tab8, int tab9
  5. #define tab_val tab0, tab1,  tab2,  tab3,  tab4,  tab5,  tab6,  tab7,  tab8,  tab9
  6. #define tab_init 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  7. #pragma warning( disable : 4307 ) // dépassement de capacité au calcul des params template
  8. // mesure du temps
  9.   class time
  10.   {
  11.      DWORD ticks;
  12.     public:
  13.    
  14.      time()
  15.      {
  16.         ticks = GetTickCount();
  17.      }
  18.      
  19.  friend ostream & operator << (ostream & os, const time & t);
  20.   };
  21.  
  22.   ostream & operator << (ostream & os, const time & t)
  23.   {
  24.      os << GetTickCount() - t.ticks << " ms";
  25.      return os;
  26.   }
  27.   time *t;
  28. // remplissage du tableau
  29. template<tab_param, unsigned long value, unsigned long count, unsigned long val, int where>
  30. struct add_tab
  31. {
  32. static void go() {}
  33. };
  34. template<tab_param, unsigned long value, unsigned long count, unsigned long val>
  35. struct add_tab<tab_val, value, count, val, 0>
  36. {
  37. static void go()
  38. {
  39.  chiffres<tab0+1, tab1,  tab2,  tab3,  tab4,  tab5,  tab6,  tab7,  tab8,  tab9 , value, count, val / 10>::go();
  40. }
  41. };
  42. template<tab_param, unsigned long value, unsigned long count, unsigned long val>
  43. struct add_tab<tab_val, value, count, val, 1>
  44. {
  45. static void go()
  46. {
  47.  chiffres<tab0, tab1+1,  tab2,  tab3,  tab4,  tab5,  tab6,  tab7,  tab8,  tab9 , value, count, val / 10>::go();
  48. }
  49. };
  50. template<tab_param, unsigned long value, unsigned long count, unsigned long val>
  51. struct add_tab<tab_val, value, count, val, 2>
  52. {
  53. static void go()
  54. {
  55.  chiffres<tab0, tab1,  tab2+1,  tab3,  tab4,  tab5,  tab6,  tab7,  tab8,  tab9 , value, count, val / 10>::go();
  56. }
  57. };
  58. template<tab_param, unsigned long value, unsigned long count, unsigned long val>
  59. struct add_tab<tab_val, value, count, val, 3>
  60. {
  61. static void go()
  62. {
  63.  chiffres<tab0, tab1,  tab2,  tab3+1,  tab4,  tab5,  tab6,  tab7,  tab8,  tab9 , value, count, val / 10>::go();
  64. }
  65. };
  66. template<tab_param, unsigned long value, unsigned long count, unsigned long val>
  67. struct add_tab<tab_val, value, count, val, 4>
  68. {
  69. static void go()
  70. {
  71.  chiffres<tab0, tab1,  tab2,  tab3,  tab4+1,  tab5,  tab6,  tab7,  tab8,  tab9 , value, count, val / 10>::go();
  72. }
  73. };
  74. template<tab_param, unsigned long value, unsigned long count, unsigned long val>
  75. struct add_tab<tab_val, value, count, val, 5>
  76. {
  77. static void go()
  78. {
  79.  chiffres<tab0, tab1,  tab2,  tab3,  tab4,  tab5+1,  tab6,  tab7,  tab8,  tab9 , value, count, val / 10>::go();
  80. }
  81. };
  82. template<tab_param, unsigned long value, unsigned long count, unsigned long val>
  83. struct add_tab<tab_val, value, count, val, 6>
  84. {
  85. static void go()
  86. {
  87.  chiffres<tab0, tab1,  tab2,  tab3,  tab4,  tab5,  tab6+1,  tab7,  tab8,  tab9 , value, count, val / 10>::go();
  88. }
  89. };
  90. template<tab_param, unsigned long value, unsigned long count, unsigned long val>
  91. struct add_tab<tab_val, value, count, val, 7>
  92. {
  93. static void go()
  94. {
  95.  chiffres<tab0, tab1,  tab2,  tab3,  tab4,  tab5,  tab6,  tab7+1,  tab8,  tab9 , value, count, val / 10>::go();
  96. }
  97. };
  98. template<tab_param, unsigned long value, unsigned long count, unsigned long val>
  99. struct add_tab<tab_val, value, count, val, 8>
  100. {
  101. static void go()
  102. {
  103.  chiffres<tab0, tab1,  tab2,  tab3,  tab4,  tab5,  tab6,  tab7,  tab8+1,  tab9 , value, count, val / 10>::go();
  104. }
  105. };
  106. template<tab_param, unsigned long value, unsigned long count, unsigned long val>
  107. struct add_tab<tab_val, value, count, val, 9>
  108. {
  109. static void go()
  110. {
  111.  chiffres<tab0, tab1,  tab2,  tab3,  tab4,  tab5,  tab6,  tab7,  tab8,  tab9+1 , value, count, val / 10>::go();
  112. }
  113. };
  114. //décomposition en chiffres
  115. template<tab_param, unsigned long value, unsigned long count, unsigned long val>
  116. struct chiffres
  117. {
  118. static void go()
  119. {
  120.  //++tab[val % 10];
  121.  //chiffres<tab_val, value, val / 10>::go();
  122.  add_tab<tab_val, value, count, val, val%10>::go();
  123. }
  124. };
  125. template<tab_param, unsigned long value, unsigned long count>
  126. struct chiffres<tab_val, value, count, 0>
  127. {
  128. static void go()
  129. {
  130.  algo<tab_val, ( ( 1664525 * value ) + 1013904223 ) & 0x7FFFFFFF, count-1>::go();
  131. }
  132. };
  133. // algo de génération de lValue
  134. template<tab_param, unsigned long value, unsigned long count>
  135. struct algo
  136. {
  137. static void go()
  138. {
  139.  chiffres<tab_val, value, count, value>::go();
  140. }
  141. };
  142. template<tab_param, unsigned long value>
  143. struct algo<tab_val, value, 0>
  144. {
  145. static void go()
  146. {
  147.  cout << "temps écoulé : " << *t << '\n';
  148.  cout << "0 : " << tab0 << " occurences\n";
  149.  cout << "1 : " << tab1 << " occurences\n";
  150.  cout << "2 : " << tab2 << " occurences\n";
  151.  cout << "3 : " << tab3 << " occurences\n";
  152.  cout << "4 : " << tab4 << " occurences\n";
  153.  cout << "5 : " << tab5 << " occurences\n";
  154.  cout << "6 : " << tab6 << " occurences\n";
  155.  cout << "7 : " << tab7 << " occurences\n";
  156.  cout << "8 : " << tab8 << " occurences\n";
  157.  cout << "9 : " << tab9 << " occurences\n";
  158. }
  159. };
  160. int main()
  161. {
  162. t=new time();
  163. algo<tab_init, ( 1013904223 ) & 0x7FFFFFFF, 5000000>::go();
  164. delete t;
  165. cin.ignore();
  166. }


---------------
-( BlackGoddess )-
n°774913
christophe​_d13
L'efficacité à tout prix.
Posté le 23-06-2004 à 21:40:56  profilanswer
 

J'ai mis au point mon nouvel ago en quelques minutes... (sans gros travail d'optimisation C).
Résultat très interressant en comparant avec l'ancien :
Ancien algo (basé sur la division 10/LUT10)
Debug : 1000ms
Release : 250ms
 
Nouvel algo (basé sur une autre approche)
Debug : 875ms (14% plus rapide)
Release : 343ms (37% plus lent)
 
Je regarde encore 2 ou 3 trucs dessus et j'arrête pour ce soir.


Message édité par christophe_d13 le 23-06-2004 à 21:43:28
n°774951
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 23-06-2004 à 22:31:52  profilanswer
 

putain, j'en chie pour arriver à faire un modulo rapide en asm sans utiliser de div [:ddr555]


---------------
J'ai un string dans l'array (Paris Hilton)
n°774986
christophe​_d13
L'efficacité à tout prix.
Posté le 23-06-2004 à 23:00:40  profilanswer
 

Ben voilà un algo assez performant en debug et release et tout ça en C pur et dur...
 
Attention, c'est super tordu !
Par contre, il n'y a aucun modulo ni division dans la boucle principale.

Code :
  1. // ConcoursHFR03.cpp : Defines the entry point for the console application.
  2. //
  3. #include <windows.h>
  4. #include <stdio.h>
  5. #include <conio.h>
  6. #include <stdlib.h>
  7. #include <malloc.h>
  8. #include <math.h>
  9. #define MACRO_plCVBCalc()   plCVB0 = &(lConvertion8bits_vers_base10[0][ lValue     &255][0]); \
  10.                             plCVB1 = &(lConvertion8bits_vers_base10[0][(lValue>> 8)&255][1]); \
  11.                             plCVB2 = &(lConvertion8bits_vers_base10[0][(lValue>>16)&255][2]); \
  12.                             plCVB3 = &(lConvertion8bits_vers_base10[0][(lValue>>24)    ][3]);
  13. #define MACRO_lSumAdx()     lSum[0] = plCVB0[   0]+plCVB1[   0]+plCVB2[   0]+plCVB3[   0]; \
  14.                             lSum[1] = plCVB0[1024]+plCVB1[1024]+plCVB2[1024]+plCVB3[1024]; \
  15.                             lSum[2] = plCVB0[2048]+plCVB1[2048]+plCVB2[2048]+plCVB3[2048]; \
  16.                             lSum[3] = plCVB0[3072]+plCVB1[3072]+plCVB2[3072]+plCVB3[3072]; \
  17.                             lSum[4] = plCVB0[4096]+plCVB1[4096]+plCVB2[4096]+plCVB3[4096]; \
  18.                             lSum[5] = plCVB0[5120]+plCVB1[5120]+plCVB2[5120]+plCVB3[5120]; \
  19.                             lSum[6] = plCVB0[6144]+plCVB1[6144]+plCVB2[6144]+plCVB3[6144]; \
  20.                             lSum[7] = plCVB0[7168]+plCVB1[7168]+plCVB2[7168]+plCVB3[7168]; \
  21.                             lSum[8] = plCVB0[8192]+plCVB1[8192]+plCVB2[8192]+plCVB3[8192]; \
  22.                             lSum[9] = plCVB0[9216]+plCVB1[9216]+plCVB2[9216]+plCVB3[9216];
  23. #define MACRO_plSumCalc()   lSum[1] += lPostAddDixaine[ lSum[0] ]; \
  24.                             (*plPostAddUnite[  lSum[0] ])++; \
  25.                             lSum[2] += lPostAddDixaine[ lSum[1] ]; \
  26.                             plSum[1] = plPostAddUnite[  lSum[1] ]; \
  27.                             lSum[3] += lPostAddDixaine[ lSum[2] ]; \
  28.                             plSum[2] = plPostAddUnite[  lSum[2] ]; \
  29.                             lSum[4] += lPostAddDixaine[ lSum[3] ]; \
  30.                             plSum[3] = plPostAddUnite[  lSum[3] ]; \
  31.                             lSum[5] += lPostAddDixaine[ lSum[4] ]; \
  32.                             plSum[4] = plPostAddUnite[  lSum[4] ]; \
  33.                             lSum[6] += lPostAddDixaine[ lSum[5] ]; \
  34.                             plSum[5] = plPostAddUnite[  lSum[5] ]; \
  35.                             lSum[7] += lPostAddDixaine[ lSum[6] ]; \
  36.                             plSum[6] = plPostAddUnite[  lSum[6] ]; \
  37.                             lSum[8] += lPostAddDixaine[ lSum[7] ]; \
  38.                             plSum[7] = plPostAddUnite[  lSum[7] ]; \
  39.                             plSum[8] = plPostAddUnite[  lSum[8] ];
  40.                            
  41. #define MACRO_StatOccurences()  if (lValue>=100000000)                      \
  42.                                 {                                           \
  43.                                     (*plSum[1])++;                          \
  44.                                     (*plSum[2])++;                          \
  45.                                     (*plSum[3])++;                          \
  46.                                     (*plSum[4])++;                          \
  47.                                     (*plSum[5])++;                          \
  48.                                     (*plSum[6])++;                          \
  49.                                     (*plSum[7])++;                          \
  50.                                     (*plSum[8])++;                          \
  51.                                                                             \
  52.                                     if (lValue>=1000000000)                 \
  53.                                         (*plPostAddUnite[ lSum[9] + lPostAddDixaine[ lSum[8] ] ])++; \
  54.                                 }                                           \
  55.                                 else if (lValue<100000000)                  \
  56.                                 {                                           \
  57.                                     for (j=7,k=0;j>=1;j--)                  \
  58.                                     {                                       \
  59.                                         if (k) (*plSum[j])++;               \
  60.                                         else                                \
  61.                                         {                                   \
  62.                                             if (plSum[j]!=&(lTableauResultatOccurences[0]))\
  63.                                             {                               \
  64.                                                 (*plSum[j])++;              \
  65.                                                 k=1;                        \
  66.                                             }                               \
  67.                                         }                                   \
  68.                                     }                                       \
  69.                                 }
  70. int main ( int argc, char * argv[] )
  71. {
  72.     long i, j, k, lValue, lTestLoop;
  73.     long lTableauResultatOccurences[10];
  74.     DWORD dwTC1, dwTC2;
  75.     char szTmp[16];
  76.     long lSum[10];
  77.     long *plSum[10];
  78.     long lConvertion8bits_vers_base10[10][256][4]; //40960 octets
  79.     long *plCVB0, * plCVB1, * plCVB2, * plCVB3;
  80.     long *plPostAddUnite[64];
  81.     long lPostAddDixaine[64];
  82.     //Boucle pour tester plusieurs fois l'algo
  83.     for (lTestLoop=0;lTestLoop<20;lTestLoop++)
  84.     {
  85.         //Uniquement sous Visual C++
  86.         dwTC1 = GetTickCount ( );
  87.         //LUT de pre-convesion 32 bits => 10 digits
  88.         for (i=0;i<4;i++)
  89.         {
  90.             for (j=0;j<256;j++)
  91.             {
  92.                 lValue = j<<(i*8);
  93.                 sprintf ( szTmp, "%010u", lValue );
  94.                 for (k=0;k<10;k++)
  95.                     lConvertion8bits_vers_base10[k][j][i] = szTmp[9-k]-48;
  96.             }
  97.         }
  98.         //LUT de post-conversion 32 bits => 10 digits
  99.         for (i=0;i<46;i++)
  100.         {
  101.             plPostAddUnite[i] = &(lTableauResultatOccurences[i%10]);
  102.             lPostAddDixaine[i] = i/10;
  103.         }
  104.         memset ( lTableauResultatOccurences, 0, sizeof(lTableauResultatOccurences) );
  105.         for (i=0,lValue=0;i<1250000;i++)
  106.         {
  107.             lValue = ( ( 1664525 * lValue ) + 1013904223 ) & 0x7FFFFFFF;
  108.             MACRO_plCVBCalc();
  109.             MACRO_lSumAdx();
  110.             MACRO_plSumCalc();
  111.             MACRO_StatOccurences();
  112.            
  113.             lValue = ( ( 1664525 * lValue ) + 1013904223 ) & 0x7FFFFFFF;
  114.             MACRO_plCVBCalc();
  115.             MACRO_lSumAdx();
  116.             MACRO_plSumCalc();
  117.             MACRO_StatOccurences();
  118.             lValue = ( ( 1664525 * lValue ) + 1013904223 ) & 0x7FFFFFFF;
  119.             MACRO_plCVBCalc();
  120.             MACRO_lSumAdx();
  121.             MACRO_plSumCalc();
  122.             MACRO_StatOccurences();
  123.             lValue = ( ( 1664525 * lValue ) + 1013904223 ) & 0x7FFFFFFF;
  124.             MACRO_plCVBCalc();
  125.             MACRO_lSumAdx();
  126.             MACRO_plSumCalc();
  127.             MACRO_StatOccurences();
  128.         }
  129.         //Uniquement sous Visual C++
  130.         dwTC2 = GetTickCount ( );
  131.         printf ( "Durée de traîtement : %d ms\n", dwTC2 - dwTC1 );
  132.     }
  133.     for (i=0;i<10;i++)
  134.     {
  135.         printf ( "%d - %d occurence", i, lTableauResultatOccurences[i] );
  136.         if (lTableauResultatOccurences[i]>1) printf ( "s" );
  137.         printf ( "\n" );
  138.     }
  139. return 0;
  140. }


 
 
La vitesse maintenant :

Debug : 703ms
Release : 265ms


 
Ancien algo (basé sur la division 10/LUT10)  

Debug : 1000ms  
Release : 250ms


 
Le gain est important en Debug (+42%) mais plus lent en release (6%).


Message édité par christophe_d13 le 23-06-2004 à 23:03:29
n°774988
Joel F
Real men use unique_ptr
Posté le 23-06-2004 à 23:03:49  profilanswer
 

quel beau concours d'enculage de mouche :o

n°774992
christophe​_d13
L'efficacité à tout prix.
Posté le 23-06-2004 à 23:07:06  profilanswer
 

Joel F> A toi de jouer...

n°775002
Joel F
Real men use unique_ptr
Posté le 23-06-2004 à 23:23:14  profilanswer
 

christophe_d13 a écrit :

Joel F> A toi de jouer...


 
j'ai autre chose à branler ... comparer des temps d'executions sur OS et machines hétéroclites n'apporte rien.
Sinon demain je lance ton bousin sur mon cluster de Mac et je tombe en dessous de 10 ms ...

n°775008
christophe​_d13
L'efficacité à tout prix.
Posté le 23-06-2004 à 23:33:45  profilanswer
 

L'intérêt est que chacun pose son code pour voir quel est le plus performant puisque qu'il suffit de le recompiler.
C'est tout l'intérêt d'un concours.
 
Cela prouve que l'on peut toujours faire mieux et que si les développeurs d'applis travaillaient un peu plus (si on leur donnaient plus de temps aussi), les programmes seraient plus performants et moins gourmands...
Tapez une lettre sous Word, c'est toujours 128Mo mininum sous WinXP... Et en plus, ça rame.
 
J'ai encore fait une variante de mon code :

Code :
  1. // ConcoursHFR03.cpp : Defines the entry point for the console application.
  2. //
  3. #include <windows.h>
  4. #include <stdio.h>
  5. #include <conio.h>
  6. #include <stdlib.h>
  7. #include <malloc.h>
  8. #include <math.h>
  9. #define MACRO_plCVBCalc()   plCVB0 = &(lConvertion8bits_vers_base10[0][ lValue     &255][0]); \
  10.                             plCVB1 = &(lConvertion8bits_vers_base10[0][(lValue>> 8)&255][1]); \
  11.                             plCVB2 = &(lConvertion8bits_vers_base10[0][(lValue>>16)&255][2]); \
  12.                             plCVB3 = &(lConvertion8bits_vers_base10[0][(lValue>>24)    ][3]);
  13. #define MACRO_lSumAdx()     lSum[0] = plCVB0[   0]+plCVB1[   0]+plCVB2[   0]+plCVB3[   0]; \
  14.                             lSum[1] = plCVB0[1024]+plCVB1[1024]+plCVB2[1024]+plCVB3[1024]; \
  15.                             lSum[2] = plCVB0[2048]+plCVB1[2048]+plCVB2[2048]+plCVB3[2048]; \
  16.                             lSum[3] = plCVB0[3072]+plCVB1[3072]+plCVB2[3072]+plCVB3[3072]; \
  17.                             lSum[4] = plCVB0[4096]+plCVB1[4096]+plCVB2[4096]+plCVB3[4096]; \
  18.                             lSum[5] = plCVB0[5120]+plCVB1[5120]+plCVB2[5120]+plCVB3[5120]; \
  19.                             lSum[6] = plCVB0[6144]+plCVB1[6144]+plCVB2[6144]+plCVB3[6144]; \
  20.                             lSum[7] = plCVB0[7168]+plCVB1[7168]+plCVB2[7168]+plCVB3[7168]; \
  21.                             lSum[8] = plCVB0[8192]+plCVB1[8192]+plCVB2[8192]+plCVB3[8192]; \
  22.                             lSum[9] = plCVB0[9216]+plCVB1[9216]+plCVB2[9216]+plCVB3[9216];
  23.                                
  24. #define MACRO_plSumCalc()   lSum[1] += lPostAddDixaine[ lSum[0] ]; \
  25.                             (*plPostAddUnite[  lSum[0] ])++; \
  26.                             lSum[2] += lPostAddDixaine[ lSum[1] ]; \
  27.                             (*plPostAddUnite[  lSum[1] ])++; \
  28.                             lSum[3] += lPostAddDixaine[ lSum[2] ]; \
  29.                             (*plPostAddUnite[  lSum[2] ])++; \
  30.                             lSum[4] += lPostAddDixaine[ lSum[3] ]; \
  31.                             (*plPostAddUnite[  lSum[3] ])++; \
  32.                             lSum[5] += lPostAddDixaine[ lSum[4] ]; \
  33.                             (*plPostAddUnite[  lSum[4] ])++; \
  34.                             lSum[6] += lPostAddDixaine[ lSum[5] ]; \
  35.                             (*plPostAddUnite[  lSum[5] ])++; \
  36.                             lSum[7] += lPostAddDixaine[ lSum[6] ]; \
  37.                             (*plPostAddUnite[  lSum[6] ])++; \
  38.                             lSum[8] += lPostAddDixaine[ lSum[7] ]; \
  39.                             (*plPostAddUnite[  lSum[7] ])++; \
  40.                             plSum[8] = plPostAddUnite[  lSum[8] ]; \
  41.                             (*plPostAddUnite[  lSum[8] ])++;
  42. #define MACRO_StatOccurences()  if (lValue>=1000000000)                                       \
  43.                                 {                                                             \
  44.                                     lTableauResultatOccurences[1]++;                          \
  45.                                     if (lValue>=2000000000)                                   \
  46.                                     {                                                         \
  47.                                         lTableauResultatOccurences[1]--;                      \
  48.                                         lTableauResultatOccurences[2]++;                      \
  49.                                     }                                                         \
  50.                                 }                                                             \
  51.                                 else if (lValue<100000000)                                    \
  52.                                 {                                                             \
  53.                                     for (j=8;j>=1;j--)                                        \
  54.                                     {                                                         \
  55.                                         if (lSum[j]) break;                                   \
  56.                                         else         lTableauResultatOccurences[0]--;         \
  57.                                     }                                                         \
  58.                                 }
  59. int main ( int argc, char * argv[] )
  60. {
  61.     long i, j, k, lValue, lTestLoop;
  62.     long lTableauResultatOccurences[10];
  63.     DWORD dwTC1, dwTC2;
  64.     char szTmp[16];
  65.     long lSum[10];
  66.     long *plSum[10];
  67.     long lConvertion8bits_vers_base10[10][256][4]; //40960 octets
  68.     long *plCVB0, * plCVB1, * plCVB2, * plCVB3;
  69.     long *plPostAddUnite[64];
  70.     long lPostAddDixaine[64];
  71.     //Boucle pour tester plusieurs fois l'algo
  72.     for (lTestLoop=0;lTestLoop<20;lTestLoop++)
  73.     {
  74.         //Uniquement sous Visual C++
  75.         dwTC1 = GetTickCount ( );
  76.         //LUT de pre-convesion 32 bits => 10 digits
  77.         for (i=0;i<4;i++)
  78.         {
  79.             for (j=0;j<256;j++)
  80.             {
  81.                 lValue = j<<(i*8);
  82.                 sprintf ( szTmp, "%010u", lValue );
  83.                 for (k=0;k<10;k++)
  84.                     lConvertion8bits_vers_base10[k][j][i] = szTmp[9-k]-48;
  85.             }
  86.         }
  87.         //LUT de post-conversion 32 bits => 10 digits
  88.         for (i=0;i<46;i++)
  89.         {
  90.             plPostAddUnite[i] = &(lTableauResultatOccurences[i%10]);
  91.             lPostAddDixaine[i] = i/10;
  92.         }
  93.         memset ( lTableauResultatOccurences, 0, sizeof(lTableauResultatOccurences) );
  94.         for (i=0,lValue=0;i<1250000;i++)
  95.         {
  96.             lValue = ( ( 1664525 * lValue ) + 1013904223 ) & 0x7FFFFFFF;
  97.             MACRO_plCVBCalc();
  98.             MACRO_lSumAdx();
  99.             MACRO_plSumCalc();
  100.             MACRO_StatOccurences();
  101.            
  102.             lValue = ( ( 1664525 * lValue ) + 1013904223 ) & 0x7FFFFFFF;
  103.             MACRO_plCVBCalc();
  104.             MACRO_lSumAdx();
  105.             MACRO_plSumCalc();
  106.             MACRO_StatOccurences();
  107.             lValue = ( ( 1664525 * lValue ) + 1013904223 ) & 0x7FFFFFFF;
  108.             MACRO_plCVBCalc();
  109.             MACRO_lSumAdx();
  110.             MACRO_plSumCalc();
  111.             MACRO_StatOccurences();
  112.             lValue = ( ( 1664525 * lValue ) + 1013904223 ) & 0x7FFFFFFF;
  113.             MACRO_plCVBCalc();
  114.             MACRO_lSumAdx();
  115.             MACRO_plSumCalc();
  116.             MACRO_StatOccurences();
  117.         }
  118.         //Uniquement sous Visual C++
  119.         dwTC2 = GetTickCount ( );
  120.         printf ( "Durée de traîtement : %d ms\n", dwTC2 - dwTC1 );
  121.     }
  122.     for (i=0;i<10;i++)
  123.     {
  124.         printf ( "%d - %d occurence", i, lTableauResultatOccurences[i] );
  125.         if (lTableauResultatOccurences[i]>1) printf ( "s" );
  126.         printf ( "\n" );
  127.     }
  128. return 0;
  129. }


Debug : 718ms
Release : 250ms


 
Up> Je vous laisse, assez plaisanté, je vais bosser... A demain.  :hello:


Message édité par christophe_d13 le 23-06-2004 à 23:56:52
n°775052
red factio​n
Posté le 23-06-2004 à 23:59:57  profilanswer
 

pour finir le code va tellement etre optimise que lensemble des define and co genera directement les resultats :D


Message édité par red faction le 24-06-2004 à 00:00:10
n°775062
the real m​oins moins
Posté le 24-06-2004 à 00:09:26  profilanswer
 

[:totoz]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°775082
Tentacle
Posté le 24-06-2004 à 00:18:36  profilanswer
 

Sans grande prétention (surtout vu mes connaissances en C :/) :
 
en 66 lignes, sur un Athlon XP 2000+ soit 133*12 (je sais plus trop mais je suis actuellement à 1667Mhz) avec 768Mo de mémoire :
 

Debug : 656 à 672 ms
Release : 344 ms


 
J'arrive en fait à ne faire que max 2 modulos par nombre pseudo-aléatoire.
 
Edit: des pointes à 329ms
Re-Edit: j'ai Visual Studio 6.0


Message édité par Tentacle le 24-06-2004 à 00:23:36
n°775213
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 24-06-2004 à 09:14:31  profilanswer
 

1er essai, largement perfectible, non optimisé, bref une grosse merde...
 

Code :
  1. .586
  2. .model flat,stdcall
  3. option casemap:none
  4. include  kernel32.inc
  5. include  masm32.inc
  6. includelib kernel32.lib
  7. includelib masm32.lib
  8. .data
  9. tab DWORD 10 dup(0)
  10. ticks DWORD 0
  11. buffer DB  12
  12. .code
  13. start:
  14. mov eax,4C4B40h
  15. xor ebx,ebx
  16. push eax
  17. invoke GetTickCount
  18. mov ticks,eax
  19. pop eax
  20. theboucle:
  21. mov edx,ebx
  22. imul edx,edx,19660Dh
  23. add edx,3C6EF35Fh
  24. and edx,7FFFFFFFh
  25. mov ebx,edx
  26. push eax
  27. mov eax,ebx
  28. mov ecx,0Ah
  29. thewhile:
  30. xor edx,edx
  31. div ecx
  32. inc dword ptr tab[edx*4]
  33. cmp eax,0
  34. jg thewhile
  35. pop eax
  36. dec eax
  37. jge theboucle
  38. invoke GetTickCount
  39. sub eax,ticks
  40. mov     ticks,eax
  41. invoke dw2hex,ticks,ADDR buffer
  42. invoke StdOut,ADDR buffer
  43. ret
  44. end start


Temps (en hexa) : 455, soit 1109 ms, exactement le même temps que le 1er essai de BlackGoddess, sur Athlon XP 2500+, 512 Mo de RAM.
J'ai pas encore codé l'affichage du nombre d'occurences, mais j'ai vérifié la mémoire, c'est la même chose que les autres, mais bon, je m'en occupe :D
Dans la boucle thewhile, le gros goulet est constitué par l'instruction div, et l'instruction inc (qui écrit en mémoire), si j'arrive à les éviter, je pense faire un carton.
J'ai mon idée pour optimiser ce bordel, la suite au prochain épisode :D


---------------
J'ai un string dans l'array (Paris Hilton)
n°775263
Joel F
Real men use unique_ptr
Posté le 24-06-2004 à 09:41:41  profilanswer
 

red faction a écrit :

pour finir le code va tellement etre optimise que lensemble des define and co genera directement les resultats :D


 
meta programmation template [:aloy]

n°775281
SoWhatIn22
Posté le 24-06-2004 à 09:52:26  profilanswer
 

Joel F a écrit :

meta programmation template [:aloy]


dans le cas de ce programme, c'est vrai qu'on peut tout connaitre à la compilation puisque la suite de nombre à analyser est toujours la même. Par contre, si la graine de départ pour la génération des nombres n'était pas connue à la compilation, alors la meta programmation template ne pourra pas être d'un grand secours.

n°775307
blackgodde​ss
vive le troll !
Posté le 24-06-2004 à 10:10:13  profilanswer
 

Joel F a écrit :

meta programmation template [:aloy]


 
bin ... c ce que j'ai essayé de faire ... qq1 pourrait me dire si c'est juste ? (cf ci dessus)


---------------
-( BlackGoddess )-
n°775338
Ummon
Posté le 24-06-2004 à 10:21:57  profilanswer
 

L'histoire de mettre un peu de gaité parmi tous ces code assembleurs :
(PII400)

#!/usr/bin/ruby
 
t = Array::new(10)
10.times{|i| t[i] = 0 }
 
n = 0
5000000.times{
   n = ((1664525 * n) + 1013904223) & 0x7FFFFFFF
   n.to_s.each_byte{|m| t[m-48] += 1 }
}
 
p t


$time main.rb > out
 
real    14m14.053s
user    10m17.569s
sys     0m47.765s


$cat out
[4454792, 6919549, 4821073, 4474832, 4473815, 4457929, 4454968, 4451157, 4450771, 4455972]


 :whistle:


Message édité par Ummon le 24-06-2004 à 10:27:09
n°775341
christophe​_d13
L'efficacité à tout prix.
Posté le 24-06-2004 à 10:22:20  profilanswer
 

On pourrait tout à fait proposer à l'utilisateur de saisir la graine de départ ?
 
Qu'en pensez-vous ?
 
Je le rajoute au problème ?

n°775377
Tentacle
Posté le 24-06-2004 à 10:34:33  profilanswer
 


Debug : 422ms
Release: 203 à 219 ms


 
plus qu'un modulo par nombre.

n°775738
darkoli
Le Petit Dinosaure Bleu
Posté le 24-06-2004 à 13:56:59  profilanswer
 

Je me suis dit qu'en diminuant le nombre de divisions et de modulos ça devrait aller plus vite et bien non !
 
Méthode basique : 47 414 858 % et 47 414 858 / => 1940ms.
Méthode Optimisée : 5 488 889 % et 5 488 889 / => 2710ms. :sweat:
 
La méthode optimisée consiste simplement à faire une table précalculée pour les nombres entre 0 et 99999 dans laquelle je stocke le nombre de chiffres ainsi que les chiffres présents dans le nombre. Exemple pour le nombre "9457" la ligne #9457 contient [4,9,4,5,7,?].
 
Ensuite pour chaque nombre je fais un modulo 100000 (qui est peut être plus long qu'un modulo 10 :??:) et avec le résultat je mets à jour les decomptes avec une boucle qui parcourt les valeurs de la ligne correspondante et incrémente le decompte de 1 à chaque fois.

p=m%100000;
for (j=1;j<=table[p][0];j++) decompte[table[p][j]]++;


Message édité par darkoli le 24-06-2004 à 13:59:33
n°775767
Tentacle
Posté le 24-06-2004 à 14:05:13  profilanswer
 

J'utilise aussi un modulo 100000 ce qui me permet de ne faire qu'un modulo par nombre :
 

Code :
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #define TABLE_LENGTH 100000
  4. int main(int argc, char* argv[])
  5. {
  6. DWORD dwTimeBefore = GetTickCount ();
  7. unsigned int count[10] = {0}; // Statistiques finales
  8. unsigned short tmpCount[TABLE_LENGTH] = {0}; // Statistiques intermédiaires
  9. int i, incr;
  10. int error; // Correction du nombre de 0
  11. unsigned long lValue, lTmpValue;
  12. unsigned long j, tmpJ;
  13. error = 0;
  14. for (i = 0, lValue = 0; i < 5000000; i++) {
  15.  lValue = (( 1664525 * lValue ) + 1013904223 ) & 0x7FFFFFFF;
  16.  lTmpValue = lValue;
  17.  while (lTmpValue > 0) {
  18.   if (lTmpValue >= TABLE_LENGTH) {
  19.    incr = lTmpValue % TABLE_LENGTH;
  20.    lTmpValue /= TABLE_LENGTH;
  21.    // Incrémentation de 'error' en fonction du nb de 0 à gauche (sur 5 chiffres)
  22.    if (incr < 10000) {
  23.     error++;
  24.     if (incr < 1000) {
  25.      error ++;
  26.      if (incr < 100) {
  27.       error ++;
  28.       if (incr < 10) {
  29.        error ++;
  30.        if (incr == 0) {
  31.         error ++;
  32.        }
  33.       }
  34.      }
  35.     }
  36.    }
  37.   } else {
  38.    incr = lTmpValue;
  39.    lTmpValue = 0;
  40.   }
  41.   tmpCount[incr]++;
  42.  }
  43. }
  44. // Calcul statistiques finales
  45. for (j = 0; j < TABLE_LENGTH; j++) {
  46.  incr = tmpCount[j];
  47.  tmpJ = j;
  48.  while (tmpJ > 0) {
  49.   count[tmpJ%10] += incr;
  50.   tmpJ /= 10;
  51.  }
  52. }
  53. count[0] += error; // Correction du nombre de 0
  54. printf ("%d ms\n", GetTickCount() - dwTimeBefore);
  55. // Affichage statistiques
  56. for (i = 0; i < 10; i++) {
  57.  printf ("%d - %d occurences\n", i, count[i]);
  58. }
  59. return 0;
  60. }


 
Je fais des statistiques temporaires et à la fin j'analyse chaque nombre de 0 à 99999 pour sortir les statistiques finales.
 
Le fait que le tableau de stats temporaires contiennent des unsigned short au lieu de unsigned int a aussi accélerer la chose (c'est une histoire de cache ?)
 
J'atteins ainsi 203ms en pointe sur mon Athlon XP2000+

n°775981
NeKoFuchik​oma
Posté le 24-06-2004 à 14:47:58  profilanswer
 

Bien joué tentacle avec ton code j'obtiens 240ms !
par contre ton while de calcul ne sert pas à grand chose (2 passe maxi)  
donc en le remplacant par :

Code :
  1. if (lTmpValue >= TABLE_LENGTH) {
  2.               incr = lTmpValue % TABLE_LENGTH;
  3.               lTmpValue /= TABLE_LENGTH;
  4.              
  5.               // Incrémentation de 'error' en fonction du nb de 0 à gauche (sur 5 chiffres)  
  6.               if (incr < 10000) {
  7.                  error++;
  8.                  if (incr < 1000) {
  9.                     error ++;
  10.                     if (incr < 100) {
  11.                        error ++;
  12.                        if (incr < 10) {
  13.                           error ++;
  14.                           if (incr == 0) {
  15.                              error ++;
  16.                           }
  17.                        }
  18.                     }
  19.                  }
  20.               }
  21.              } else {
  22.               incr = lTmpValue;
  23.               lTmpValue = 0;
  24.            }
  25.            
  26.            tmpCount[incr]++;
  27.          
  28.            if (lTmpValue >= TABLE_LENGTH) {
  29.               incr = lTmpValue % TABLE_LENGTH;
  30.               //lTmpValue /= TABLE_LENGTH;  
  31.              
  32.               // Incrémentation de 'error' en fonction du nb de 0 à gauche (sur 5 chiffres)  
  33.               if (incr < 10000) {
  34.                  error++;
  35.                  if (incr < 1000) {
  36.                     error ++;
  37.                     if (incr < 100) {
  38.                        error ++;
  39.                        if (incr < 10) {
  40.                           error ++;
  41.                           if (incr == 0) {
  42.                              error ++;
  43.                           }
  44.                        }
  45.                     }
  46.                  }
  47.               }
  48.              } else {
  49.               incr = lTmpValue; 
  50.            }
  51.            
  52.            tmpCount[incr]++;


 
je tombe à 200ms  :D  
 
A+
:: NeKo ::


Message édité par NeKoFuchikoma le 24-06-2004 à 14:54:41
n°776053
Tentacle
Posté le 24-06-2004 à 14:58:48  profilanswer
 

oui je sais qu'il ne sert à rien, mais j'ai pas pensé qu'en l'enlevant on pouvait gagner autant. En fait je l'avais laissé car je testais plusieurs valeurs de TABLE_LENGTH (même si le reste du code ne s'adapte pas trop ... c'est du bidouillage de toute façon).
En fait quand tmpCount était encore un tableau de unsigned int, TABLE_LENGTH = 10000 donnait le meilleur resultat ce qui nécéssitait 2 modulos. Ca m'étonnait d'aileurs que perdre du temps avec 100000 (avec 1 modulo donc) alors je me suis dit que c'était peut-être la taille du tableau d'où le unsigned short.
 
Tu pourrais d'ailleurs aussi enlevé le test (lTmpValue >= TABLE_LENGTH) pour la 2eme passe vu qu'il ne sera (à priori) jamais vérifié.
Tu as d'ailleurs oublié un test vu qu'on ne doit pas faire la 2eme passe si lTmpValue == 0;
 
De mon côté j'arrive à 187 à 203ms
 
Edit: merci de la remarque :jap:


Message édité par Tentacle le 24-06-2004 à 14:59:08
n°776111
Ummon
Posté le 24-06-2004 à 15:12:01  profilanswer
 

Et voila, encore une fois : il vaut mieux un code de haut niveau bien pensé plutot que du bidouillage de bas niveau (assembleur). (je vais me faire taper mais c pas grave)

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4

Aller à :
Ajouter une réponse
 

Sujets relatifs
Le concours de programmation ICFP 2004 a commencé[Concours] Recherche de doublons dans une séquence
[java/algo] Concours - implémenter une itf simple de gestion d'agenda.[IA] petite idée de concours
concours de code[C++] Concours de code : new test en cours, proposez votre solution !
Concours programmation[PHP] Comment organiser un concours
organiser un concours .[Concours] Votre Requête MySQL la plus complexe
Plus de sujets relatifs à : [Concours No 3] A vos cerveaux !


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)