Optimiser une procédure, comparaison listes chaînées

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Ollivier a écrit :@Kcc
Kcc a écrit :Maitre OLLIVIER
Je ne suis pas un maître.
Ne t'inquiète pas, un code va être pondu incessamment sous peu.
PS: J'en profite sans te froisser pour te dire que ton avatar me pose des problèmes depuis pas mal de temps. Pourrais-tu s'il te plaît mettre un truc "statique" à la place? (temporairement) Ce serait vraiment super cool de ta part...
Ollivier
Tu code en C, je crois aussi en assembleur, c'est à dire les deux armes les plus aiguisées et les plus dangereuses de la programmation 8)
Tu essai toujours d'aider quand tu le peut
Tu nous pond parfois des codes à la limite de l'horlogerie, avec noir de hieroglyphe dedans 8O
D'ailleurs, je crois meme qui en avait qui donnait l'heure :lol: (Sans te froisser....je parle evidemment de ceux que tu fini) :wink: :lol:

Pour ma part, tu est un MAITRE de la programmation.
Pas de fausse modestie, pour KCC tu es un exemple 8)
Peut etre pas un METRE 99 :lol:
Mais deja un maitre, comme certains sur ce forum.

Peut etre postulera tu pour etre GRAND MAITRE, voir meme MAITRE SUPREME :D
KCC, il est fier de te connaitre, et lui y postule pour simple programmeur, et si il y arrive y sera fier de lui :roll:

Comme tes désirs MAITRE, sont des ordres, pour le jeune padawan KCC :wink:
KCC y a changé son avatar
Continue a nous épater, on a besoin de décérébrés comme toi 8)
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

@Kwaï

Et il y a des fois, quand la pleine lune se faufile entre les cumulo-nimbi de la nuit, quand l'odeur de l'algue* lointaine parcourt tes narines jusqu'à ce que fougue t'embrase, quand les mouettes et les corneilles hurlent à trente mètres au dessus de ta tête, c'est vrai qu'il y a un petit quelque chose d'inexplicable quand à la production de code. Mais je ne contrôle rien. Alors, ce serait bien honorable de ta part de ne pas me prendre pour un "mètre", qu'il soit étalon, ruban, carré ou linéaire, ce n'est pas mon grade!

Ollivier
Dernière modification par Ollivier le lun. 30/mars/2009 16:55, modifié 3 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

j'ai deja demandé pour moi aussi que Kcc arrete ce protocole
je pense toujours a la morale de lafontaine

"tout flateur vit au depends de celui qui l'écoute"
et depuis je profite de mon fromage :)

du reste cette manière de se présenter comme le roi des gourdes, une sous merde....est pour ma part, presque "insultant", car j'ai l'impression d'etre pris pour un gros naze en fait ....

j'ai l'impression d'une odeur d'hypocrisie évidente
de plus, je me dit que ça ne peux marcher qu'avec les "anglais" :lol:

bref, cette attitude me choque en fait !..

autant que quelqu'un qui voudrai imposer son point de vue
j'estime que se comporter comme une serpillière
c'est tout autant choquant !

peut etre peut on voir ça comme de l'humour
mais en fait c'est comme l'humour sur les handicapés, les noirs, les noirs handicapés,les anglais.... cela peut etre tres drôle ..., mais faut pas que cela devienne
une litanie,(quasi a chaque messages) sinon ça deviens du harcellement pour notre intelligence
une forme d'agression meme ...

je pense aussi au homosexuel, qui finalement font souvent un point central de leur conversations, de leur préferences sexuel
comme si toute leur vie tournait autour de ça !!
(c'est une observation que j'ai eu l'occasion de vérifier bien souvent !)


voila ça fait un moment que je voulais dire ça

KCC si tu m'entends :)
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Bon... (Un peu plus dans le sujet!) J'ai fait un espèce de tuto sous forme de code. J'espère que ça passe chez tout le monde.

Kcc, n'hésite pas à poser des questions dans le plus correct des repsects pour toi-même! ça ne changera pas la gueule des réponses!

Code : Tout sélectionner

Global BaseW.I
Global BaseH.I

Procedure Base(w, h)
   BaseW = w
   BaseH = h
EndProcedure

Procedure.I W(N.I, D.I)
   Protected Result.I
   Result = BaseW * N / D     
   ProcedureReturn Result
EndProcedure

Procedure.I H(N.I, D.I)
   Protected Result.I
   Result = BaseH * N / D     
   ProcedureReturn Result
EndProcedure

Procedure Arrow(X.F, Y.F, DX.F, DY.F)
   Line(X, Y, DX, DY)
   Line(X + DX - 10, Y - 5, 10, 5, #Black)
   Line(X + DX - 10, Y + 5, 10, -5, #Black)
EndProcedure

Procedure SemiBoxU(X, Y, DX, DY)
   Box(X, Y + 1, DX, DY, #Black)
   Box(X + 1, Y + 1, DX - 2, DY - 2, #White)
EndProcedure

Procedure SemiBoxn(X, Y, DX, DY)
   Box(X, Y, DX, DY - 1, #Black)
   Box(X + 1, Y + 1, DX - 2, DY - 2, #White)
EndProcedure

Procedure Aff(X, Y, Text.S)
   DrawText(X + 16, Y + 10, Text)
EndProcedure

   ExamineDesktops()
   Dw = DesktopWidth(0)
   Dh = DesktopHeight(0)
   Dd = DesktopDepth(0)

   Base(Dw, Dh)

   OpenWindow(0, 0, 0, 0, 0, "I. Extraction d'un numéro d'alvéole à partir du contenu d'une chaîne", $1CF0001)
   
   CreateImage(0, Dw, Dh)
   StartDrawing(ImageOutput(0) )
      Chaine.S = "Moi, c'est Dudu..."
      MD5.S = MD5Fingerprint(@Chaine, Len(Chaine) )
      MD524.S = Left(MD5, 6)
      Addr.I = Val("$" + MD524)
      Box(0, 0, W(1, 1), H(1, 1), #White)
      DrawText(W(1, 16), H(1, 16), "1) Exemple de chaîne : " + Chr(34) + Chaine + Chr(34) )
      DrawText(W(1, 16), H(2, 16), "2) Empreinte MD5 128 bits de " + Chr(34) + Chaine + Chr(34) )
      DrawText(W(1, 16), H(3, 16), "= 0x " + MD5 + " (hexa)")
      DrawText(W(1, 16), H(4, 16), "3) Troncature à 24 bits ( ~ 16 millions de possibilités)")
      DrawText(W(1, 16), H(5, 16), "= 0x " + MD524 + " (hexa)")
      DrawText(W(1, 16), H(6, 16), "4) Conversion Hexadécimal/Décimal")
      DrawText(W(1, 16), H(7, 16), "= " + Str(Addr) )
      DrawText(W(1, 16), H(8, 16), "Donc " + Chr(34) + Chaine + Chr(34) + " occupera l'alvéole n°" + Str(Addr) )
   StopDrawing()
   ImageGadget(0, 0, 0, Dw, Dh, ImageID(0) )
   Repeat
      Evt = WaitWindowEvent()
   Until Evt = 16 Or Evt = #PB_Event_Gadget
   
   CloseWindow(0)

   OpenWindow(0, 0, 0, 0, 0, "II. Définition d'une alvéole", $1CF0001)
   
   CreateImage(0, Dw, Dh)
   StartDrawing(ImageOutput(0) )
      Chaine.S = "Moi, c'est Dudu..."
      MD5.S = MD5Fingerprint(@Chaine, Len(Chaine) )
      MD524.S = Left(MD5, 6)
      Addr.I = Val("$" + MD524)
      Box(0, 0, W(1, 1), H(1, 1), #White)
      DrawText(W(1, 16), H(1, 16), "Une alvéole c'est une cellule mémoire." )
      DrawText(W(1, 16), H(2, 16), "Précédemment, on a vu qu'un numéro d'alvéole s'étendait sur 24 bits.")
      DrawText(W(1, 16), H(3, 16), "24 bits, c'est environ 16 millions de possibilités (exactement 2 puissance 24 = " + Str(1 << 24) + " possibilités)")
      DrawText(W(1, 16), H(4, 16), "Une cellule mémoire doit contenir le minimum élémentaire pour décrire un objet.")
      DrawText(W(1, 16), H(5, 16), "Dans notre cas, les objets sont des chaînes donc un pointeur est suffisant.")
      DrawText(W(1, 16), H(6, 16), "Un pointeur 32 bits, c'est 4 octets (XP/Linux).")
      DrawText(W(1, 16), H(7, 16), "Sous Vista (64 bits), c'est 8 octets.")
      DrawText(W(1, 16), H(9, 16), "Résultat, le tableau des alvéoles fera 4 * 16 millions d'octets dans les cas généraux,")
      DrawText(W(1, 16), H(10, 16), "et 8 * 16 millions d'octets sous Vista.")
      DrawText(W(1, 16), H(12, 16), "XP/Linux : 64Mo d'allocation mémoire")
      DrawText(W(1, 16), H(13, 16), "Vista : 128Mo d'allocation mémoire")
   StopDrawing()
   ImageGadget(0, 0, 0, Dw, Dh, ImageID(0) )
   Repeat
      Evt = WaitWindowEvent()
   Until Evt = 16 Or Evt = #PB_Event_Gadget
   
   CloseWindow(0)

   OpenWindow(0, 0, 0, 0, 0, "III. Occupation d'une alvéole", $1CF0001)
   CreateImage(0, Dw, Dh)
   StartDrawing(ImageOutput(0) )
      Chaine.S = "Moi, c'est Dudu..."
      MD5.S = MD5Fingerprint(@Chaine, Len(Chaine) )
      MD524.S = Left(MD5, 6)
      Addr.I = Val("$" + MD524)
      Box(0, 0, W(1, 1), H(1, 1), #White)
      DrawText(W(1, 16), H(1, 16), "Il y a trois manières d'occuper une alvéole." )
      DrawText(W(1, 16), H(3, 16), "1) L'alvéole est vide")
      DrawText(W(1, 16), H(4, 16), "Il n'y a pas de chaîne qui corresponde à cette alvéole.")
      DrawText(W(1, 16), H(5, 16), "Son contenu est nul ( = 0).")
      DrawText(W(1, 16), H(7, 16), "2) L'alvéole contient un pointeur direct.")
      DrawText(W(1, 16), H(8, 16), "Une seule chaîne dans la base de donnée correspond à cette alvéole.")
      DrawText(W(1, 16), H(9, 16), "L'alvéole contient l'adresse (ou pointeur) vers la chaîne en question.")
      DrawText(W(1, 16), H(11, 16), "3) L'alvéole contient un pointeur indirect.")
      DrawText(W(1, 16), H(12, 16), "Dans ce cas, plusieurs chaîne correspondent à cette alvéole.")
      DrawText(W(1, 16), H(13, 16), "Tout comme le MD5 est une méthode que j'ai choisi, et que mes choix ne sont qu'à")
      DrawText(W(1, 16), H(14, 16), "titre d'exemple, dans ce cas où il y a " + Chr(34) + "collision" + Chr(34) + " (plusieurs chaînes pour une seule alvéole) ...")
   StopDrawing()
   ImageGadget(0, 0, 0, Dw, Dh, ImageID(0) )
   Repeat
      Evt = WaitWindowEvent()
   Until Evt = 16 Or Evt = #PB_Event_Gadget
   CloseWindow(0)
   
   OpenWindow(0, 0, 0, 0, 0, "III. Occupation d'une alvéole (suite)", $1CF0001)
   CreateImage(0, Dw, Dh)
   StartDrawing(ImageOutput(0) )
      Chaine.S = "Moi, c'est Dudu..."
      MD5.S = MD5Fingerprint(@Chaine, Len(Chaine) )
      MD524.S = Left(MD5, 6)
      Addr.I = Val("$" + MD524)
      Box(0, 0, W(1, 1), H(1, 1), #White)
      DrawText(W(1, 16), H(1, 16), "... J'ai choisi de créer une table intermédiaire." )
      DrawText(W(1, 16), H(2, 16), "Elle contient :")
      DrawText(W(1, 16), H(4, 16), "- une marque d'identification (pour ne pas la confondre avec une chaîne)" )
      DrawText(W(1, 16), H(5, 16), "- le nombre de pointeurs de chaînes (minimum = 2)" )
      DrawText(W(1, 16), H(6, 16), "- les pointeurs, les uns après les autres." )
   StopDrawing()
   ImageGadget(0, 0, 0, Dw, Dh, ImageID(0) )
   Repeat
      Evt = WaitWindowEvent()
   Until Evt = 16 Or Evt = #PB_Event_Gadget
   CloseWindow(0)
   
   
   OpenWindow(0, 0, 0, 0, 0, "IV. Schématique", $1CF0001)
   CreateImage(0, Dw, Dh)
   StartDrawing(ImageOutput(0) )
      Chaine.S = "Moi, c'est Dudu..."
      MD5.S = MD5Fingerprint(@Chaine, Len(Chaine) )
      MD524.S = Left(MD5, 6)
      Addr.I = Val("$" + MD524)
      Box(0, 0, W(1, 1), H(1, 1), #White)
      For Y = 0 To 10
         If Y = 0
            SemiBoxU(W(1, 8), H(1, 8) + 32 * Y, 96, 32)
         Else
            If Y = 10
               SemiBoxn(W(1, 8), H(1, 8) + 32 * Y, 96, 32)
            Else
               Box(W(1, 8), H(1, 8) + 32 * Y, 96, 32, #Black)
               Box(W(1, 8) + 1, H(1, 8) + 1 + 32 * Y, 94, 30, #White)
            EndIf
         EndIf
         If Y = 1
            Aff(W(1, 8), H(1, 8) + 32 * Y, "*ChaineX")
         EndIf
         If Y = 3
            Aff(W(1, 8), H(1, 8) + 32 * Y, "*NodeX")
         EndIf
      Next Y
      Arrow(W(1, 8) + 128, H(1, 8) + 48, 256.0, 0.0)
      Aff(W(1, 8) + 128 + 256, H(1, 8) + 32, Chr(34) + "Chaine Dudu" + Chr(34) )
      Arrow(W(1, 8) + 128, H(1, 8) + 48 + 64, 64.0, 0.0)
      Arrow(W(3, 8) + 128, H(1, 8) + 48 + 64 + 64, 64.0, 0.0)
      Aff(W(3, 8) + 128 + 64, H(1, 8) + 48 + 64 + 48, Chr(34) + "Chaine Dédé" + Chr(34) )
      Arrow(W(3, 8) + 128, H(1, 8) + 48 + 64 + 96, 64.0, 0.0)
      Aff(W(3, 8) + 128 + 64, H(1, 8) + 48 + 64 + 80, Chr(34) + "Chaine Nono" + Chr(34) )
      For Y = 0 To 4
         If Y = 4
            SemiBoxn(W(3, 8), H(1, 8) + 96 + 32 * Y, 96, 32)
         Else
            Box(W(3, 8), H(1, 8) + 96 + 32 * Y, 96, 32, #Black)
            Box(W(3, 8) + 1, H(1, 8) + 97 + 32 * Y, 94, 30, #White)
         EndIf
         If Y = 0
            Aff(W(3, 8), H(1, 8) + 96 + 32 * Y, "Id (*Node)")
         EndIf
         If Y = 1
            Aff(W(3, 8), H(1, 8) + 96 + 32 * Y, "Nb d'adr.")
         EndIf
         If Y = 2
            Aff(W(3, 8), H(1, 8) + 96 + 32 * Y, "*Adr1")
         EndIf
         If Y = 3
            Aff(W(3, 8), H(1, 8) + 96 + 32 * Y, "*Adr2")
         EndIf
         If Y = 4
            Aff(W(3, 8), H(1, 8) + 96 + 32 * Y, "...")
         EndIf
      Next Y
   StopDrawing()
   ImageGadget(0, 0, 0, Dw, Dh, ImageID(0) )
   Repeat
      Evt = WaitWindowEvent()
   Until Evt = 16 Or Evt = #PB_Event_Gadget
   CloseWindow(0)
   
   End
   
    
Dernière modification par Ollivier le lun. 30/mars/2009 16:54, modifié 2 fois.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

@Octavius
Octavius a écrit :

Code : Tout sélectionner

Names()\Item=Len(Names()\In$)*100+Asc(Left(Names()\In$,1)) 
Pourrais-tu me dire, Octavius, dans ton code, c'est quoi cette ligne d'épicier ?!?!?

J'avais commencé par te dire qu'il fallait 32 Gigaoctets pour répondre correctement à ta demande. En me pressant le jus, je me suis dit qu'on pouvait réduire pour avoir quelque chose un peu plus "à échelle humaine" : 64Mo (ou 128Mo pour Vista), soit 16 millions de variables de type long.

Alors toi, tu m'as pondu le truc à bréveter : "je te prends la longueur de la chaîne que je multiplie par 100 et que je rajoute le code ASCII du premier caractère! ! !"

Il te faut quelque chose d'un peu plus carré tout de même!!! Alors, j'ai été faire le pitre sur le forum d'outre tout en espérant que quelqu'un vienne à mon secours, mais visiblement ils n'ont pas pris ma blague à la légère...

ça ne fait rien, en attendant, teste le Crc32 ou le MD5 à la place de ta "formule magique". ça prend peut-être plus de place mais la rapidité s'en trouve accrue.

Ollivier
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

KCC si tu m'entends
J'ai dans une longue conversation en PM avec toi, pris la peine de t'expliquer ma maniere de me comporter.
Chaque etre, est different et par cette difference génere rejet ou attirance.

De meme la communauté est un lieu ou apprendre l'autre, est un mal ou un bien nécéssaire.
C'est par cette action, que l'on forme une vraie communauté.
L'acceptation d'autruis passe aussi, par l'adaptation de sa conception du "bon" comportement.

J'en veux en exemple, le fait que par certaines de tes attitudes agréssives, tu me choque depuis longtemps.
Et je ne suis pas le seul, a lire ce forum, car moultes fois j'ai pris ta défense, dont tu n'avais pas besoin je le concede, sur tes acces d'humeurs plus ou moins justifiés et ceci avec plusieurs membres.
Moi qui déteste les conflits de tout genres, n'apprécie que la douceur, l'amitié, le savoir vivre, la politesse et toutes manifestations menant à ce que deux etres quel qui soient, se rapprochent :?

En fait j'ai du adapter ma conception du "bon" comportement pour te comprendre.
Mon admiration pour tes multiples talents, si ce n'est pas specialement en programmation, ont fait que j'ai appris a mettre mon poing dans ma poche et ne pas te dire cette vérité que tu me jete à la figure aujourd'hui. :?

Mais puisque tu te permet, et que tu prone l'égalité.....j'entend par la lecture de la mienne, que tu prenne conscience, que l'on a tous certaines choses qui nous dérangent en autruis.
C'est le triste et lourd fardeau de la collectivité qu'il est nécéssaire de porter :?

Mais tolérance est mere de toutes les qualités pour que communauté perdure 8)
mais faut pas que cela devienne
une litanie,(quasi a chaque messages) sinon ça deviens du harcellement pour notre intelligence
une forme d'agression meme ...
Si je le répete, c'est que je le pense.....
Le jour, si jour il y a ......ou je saurais programmer, je sais que je n'aurais pas l'humilité de FRED, FLYPE, GNOZAL, SPARKIE.....ainsi que presque tous les membres de ces forums
Je pense que je doit, pour faire taire ma pretention, la remettre à sa juste place, c'est à dire le sous sol.

Quand à l'agression, je suis désolé, d'avoir généré en toi ce sentiment aux antipodes de ma volonté. :cry:

Maintenant sache que tu n'a pas le monopole de l'agressivité, du franc parlé, et de l'impulsivité.
Je vais donc te dire, ma sincere pensée.
Tu as raison, je t'ai appellé MAITRE à tort a mon arrivé sur ce forum.
Tu as refusé ce titre, c'est ton premier droit que j'ai immediatement respecté, comme je le ferais pour OLLIVIER et tout ceux qui me le demanderons, si je les appellent ainsi et que cela les genent.
Et je tiens à m'excuser aussi, si certains que j'ai appellé ainsi par respect, se sont senti outragé ou agacé :oops:

Pour moi ce titre, n'a pas d'autre but que de démontrer mon admiration, et en aucun cas il n'y a d'autres intention que celle ci.
Comme je te l'ai déjà expliqué, quelqu'un peut etre un "MAITRE" c'est à dire avoir un niveau assez suffisant pour enseigner, ce qui ne l'empeche pas d'etre à son tour l'eleve d'un autre.
Ce titre comme l'avais dit GEBONET je crois, c'est à l'eleve de le donner, sinon c'est de la pretention voir meme une forme de sous dictature :?

Oui maintenant, je te l'accorde, tu n'est pas un MAITRE de la programmation.
Tu es fort, mais tu as raison, ce titre ne te convenait pas.
J'ai eu tort :oops:

Mais quand je vois les codes d'OLLIVIER, je me suis vite rendu compte qu'on jouait pas dans la meme cour, comme ceux de SOLDAT, NICO, COMTOIS, CASE, DENIS, DRI ,PROGI,et plein d'autre que je m'excuse de ne pas citer :oops:
Voila c'est tout, ni plus ni moins 8)

Et pour en finir avec les vérités.....outre ton agressivité, et le fait que tu vois souvent le mal ou il n'est pas, triste symbol de la suceptibilité exacerbée que nous possedons tous les deux (Alors je sais de quoi je parle :?)

Code : Tout sélectionner

j'ai l'impression d'une odeur d'hypocrisie évidente 
de plus, je me dit que ça ne peux marcher qu'avec les "anglais"
Tu as mis un smiley, de rigolade, mais ce n'est pas la premiere fois que tu les critique :?
J'adore ce forum français, et j'ai été tout aussi bien accueuilli chez eux.
Et je pense ne pas etre le seul :roll:
Car je croise beaucoup de français, qui se sentent aussi à l'aise que sur le FR, si ce n'etait cette saloperie de barriere du language. :?

Certe la communauté avec des etranger requiert encore plus "d'ouverture d'esprit".
Alors demande toi, juste une fois,.......et ceci avant d'insulter le digicode, pourquoi........ quand tu est dans le noir devant la porte à code d'une allée et que tu as tapé X fois le meme code.......
Pose toi juste une question toute bete :
"Tiens cette porte ne s'ouvre pas .....n'aurais je pas tapé le code de ma carte bleue??? :roll:"

Ils ont peut etre des regles differentes, des us et coutumes differentes, un humour different, qu'il nous reste a apprendre.
Mais je me refuse à penser que nous soyons les seuls a detenir la vérité, le bon humour ou que sais-je encore ????
Ils doivent parfois penser la meme chose que toi parfois, et pourtant peut etre qu'il ne se permettent pas de nous juger.
Et cela ne les empechent pas de nous apprecier, nous les mangeurs de grenouilles avec notre beret et notre pain sous le bras :oops:

Voila j'espere donc t'avoir prouvé en quelque mot que la "serpillere" sait mordre quand on la blesse.
Et surtout que tu peut rayer le mot hypocrite de la longue liste de mes defauts :?

Car serpillere et sous merde, je suis et le revendique en programmation....(Termes certes un peu excessifs, meme si c'est que je me dit parfois en regardants certains de vos codes :? )
Mais sache bien que dans la vie, et sur d'autres sujets diametralements opposés, ou la je considere ne pas etre cet ustencile de menage, voir meme un MAITRE
Et bien, je me fait un malin plaisir de redescendre certains personnages, qui eux ont cette puante pretention d'ouvrir leur four, et par cette action, faire croire a une pseudo connaissance, qui ne serait sanctionnée que par un seul diplome de TECHNICIEN....celui de surface :?

Voila donc, DOBRO si tu m'entends .....

@OCTAVIUS
Je tiens pour une des premiere fois a m'excuser de cette discution qui a dérapé et qui est venue gener ton POST
Je suis partisan, contrairement a Bernard13, du fait que l'on puisse tout dire dans n'importe quel POST surtout si c'est le miens
Mais la....je doit reconnaitre que c'est peut etre un peu trop reglement de compte a OK CORAL :oops:
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Visiblement mon tutoriel est à chier...

Bon je reprendrai une version plus attractive à tête reposée.
Dernière modification par Ollivier le lun. 30/mars/2009 16:53, modifié 2 fois.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

(mais plutôt en pm, ce serait cool...)
L'attaque a été faite aux yeux et vue de tous...., alors j'ai jugé que la réponse devait en etre de même. :?
Je pense que maintenant nos avis ont été partagé, sur un fond de sincérité mutuelle, et que l'incident devrait etre clos, enfin j'espére :roll:

Maintenant ....pour le reste tu as milles fois raison 8)
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Ollivier a écrit :Visiblement mon tutoriel est à chier...

Bon je reprendrai une version plus attractive à tête reposée.
Non non, je le trouve excellent :D
Bien cette technique de présentation.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

@Jacobus

Ben, merci c'est cool. Désolé, j'avais déserté. J'espère que ça te permet d'y voir un peu plus clair.

Ollivier
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Message par Octavius »

Je suis en train d'écrire un code complet avec le principe de la table de hachage (CAM). Dès que j'ai fini, je le publie ici.
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Message par Octavius »

Voilà qui est fait ! Pour faire tourner mes 3 codes, il faut télécharger ces fichiers, ils contiennent les éléments des listes chaînées : Name Files

Voici les différents codes que j'ai essayé (la partie intéressante est entre les étoiles), d'abord la manière brutale :
3 858 ms avec le débogueur
315 ms sans le débogueur

Code : Tout sélectionner

;Cette commande m'oblige à déclarer préalablement toutes les variables que j'utilise
EnableExplicit

;-Initialisations
;{

Enumeration
  #FileName
  #FileCharName
EndEnumeration
Enumeration
  #MissName=0
  #FirstName=1
  #Surname=2
EndEnumeration

;Structure simple permettant de faire correspondre un
;Identifiant interne du programme (In$) avec un nom
;Externe (Out$) qui apparaitra sur l'interface utilisateur
Structure name
  In$
  Out$
EndStructure

;Structure complexe permettant de classer les différents
;Possibles des personnages avec d'autres informations
Structure charname Extends name
  Faction$
  Type.b
EndStructure

;Structure de l'empreinte CRC32
Structure crc32
  Left.w
  Right.w
EndStructure

;Structure d'un noeud
Structure node
  *Address
  *Next.node
EndStructure

Dim CRC32Table.node(65535) ;Tableau temporaire avec une partie des codes CRC32 possibles (512 Mo)

NewList Names.name()
NewList CharNames.charname()

Define String$,Faction$
Define Time.q
Define Type.w,Length.w,Number.w
Define *Address
Define *Node.node,CRC32.crc32

Declare.q Ticks()

;}

;-Macros

;Lecture d'un fichier au format .txt.strings.bin
Macro ReadStringsBin(FILE,NAMES,TYPE,LENGTH,NUMBER,ADDRESS)
  ;FILE est la constante qui identifie le fichier à lire
  ;NAMES doit être une liste chaînée avec une Structure comprenant les champs In$ et Out$ (comme name)
  ;TYPE, LENGTH et NUMBER doivent être des words .w
  ;ADDRESS est un pointeur mémoire de type *Address
  
  ;Initialisation
  TYPE=-4
  ;Boucle de lecture du bin
  While Not Eof(FILE)
    ;Longueur à lire
    LENGTH=ReadWord(FILE)
    ;Nombre d'entités à lire
    If TYPE=-2 : NUMBER=LENGTH*2 : EndIf
    ;Si la longueur n'est pas nulle
    If LENGTH
      ;Si on a dépassé l'entête
      If TYPE>-1
        ;Sélection du cas : In=0 et Out=1
        Select TYPE%2
          Case 0
            ;Ajoute un élément
            AddElement(NAMES)
            ;Allocation de mémoire pour la chaîne de caractère
            ADDRESS=AllocateMemory(LENGTH*2+1) ;+1 octet, important à la fin de toute chaîne de caractère
            ;Lecture effective de la chaîne
            ReadData(FILE,ADDRESS,LENGTH*2)
            ;On met un zéro pour signaler la fin de la chaîne de caractère
            PokeW(ADDRESS+LENGTH*2,0)
            ;Stockage de la chaîne de caractère ainsi créée
            NAMES\In$=PeekS(ADDRESS,LENGTH*2+1,#PB_Unicode) ;Format unicode, très important
            ;Libération de la mémoire temporaire, important
            FreeMemory(ADDRESS)
          Case 1
            ;Même procédure que ci-dessus
            ADDRESS=AllocateMemory(LENGTH*2+1)
            ReadData(FILE,Address,LENGTH*2)
            PokeW(ADDRESS+LENGTH*2,0)
            NAMES\Out$=PeekS(ADDRESS,LENGTH*2+1,#PB_Unicode)
            FreeMemory(ADDRESS)
        EndSelect
      EndIf
    EndIf
    ;Incrémentation automatique
    TYPE+1
    ;Si toutes les entités ont été lues, on quitte la boucle avant la fin du fichier
    If TYPE=NUMBER : Break : EndIf
  Wend
EndMacro

;Nettoyage complet d'une chaîne de caractères
Macro ClearString(STRING)
  ;Remplacement des tabulations par des espaces
  ReplaceString(STRING,Chr(9)," ",2)
  ;Suppression des commentaires
  If FindString(STRING,";",1) : STRING=Left(STRING,FindString(STRING,";",1)-1) : EndIf
  ;Suppression des espaces devant et derrière
  STRING=Trim(STRING)
EndMacro

;Suppression de la première partie d'une chaîne (il ne reste que l'argument)
Macro Argument(STRING,LENGTH)
  STRING=Trim(Mid(STRING,LENGTH+1))
EndMacro

;-Lecture des fichiers

;Fichier de données sur les noms de personnages (uniquement sous forme d'identifiants)
ReadFile(#FileCharName,"descr_names.txt")

While Not Eof(#FileCharName)
  
  ;Lecture et nettoyage
  String$=ReadString(#FileCharName,#PB_Ascii)
  ClearString(String$)
  If String$="" : Continue : EndIf
  
  If Left(String$,8)="faction:"
    Argument(String$,8)
    Faction$=String$
  ElseIf String$="characters" : Type=#FirstName
  ElseIf String$="women" : Type=#MissName
  ElseIf String$="surnames" : Type=#Surname
  Else
    AddElement(CharNames())
    CharNames()\In$=String$
    CharNames()\Faction$=Faction$
    CharNames()\Type=Type
  EndIf
Wend

CloseFile(#FileCharName)

;Ouverture du fichier spécifique à la langue du jeu vidéo
;Faisant correspondre les identifiants internes avec les noms
;Externes visibles sur l'interface utilisateur

ReadFile(#FileName,"names.txt.strings.bin")
ReadStringsBin(#FileName,Names(),Type,Length,Number,*Address)
CloseFile(#FileName)

;-Recherche des identifiants
;*****************************************************************************************

;Pour le temps
Time=Ticks()

;Par convention, les espaces sont équivalents aux tirets-bas
ForEach Names()
  Names()\In$=ReplaceString(Names()\In$,"_"," ")
Next

;Correspondance avec les identifiants internes
ForEach CharNames()
  
  Type=1
  String$=ReplaceString(CharNames()\In$,"_"," ")
  
  ;Recherche brute dans la liste
  ForEach Names()
    ;Comparaison des chaînes
    If  String$=Names()\In$
      CharNames()\Out$=Names()\Out$
      Type=0
      Break
    EndIf
  Next
  
  ;Vérification qu'un nom externe a bien été retrouvé
  If Type
    MessageRequester("Erreur !","L'identifiant '"+CharNames()\In$+"' ne correspond à aucun nom !")
  EndIf
  
Next

;Il vaut mieux compiler le programme
;Plutôt que d'utiliser le débogueur
;Debug Ticks()-Time
MessageRequester("Information","Temps : "+Str(Ticks()-Time)+" ms !")

;*****************************************************************************************

;-Procédures

;Chronomètre de précision
Procedure.q Ticks()
  Protected Freq.q,Time.q
  QueryPerformanceFrequency_(@Freq)
  Freq=Freq/1000
  QueryPerformanceCounter_(@Time)
  ProcedureReturn Time/Freq
EndProcedure
Ensuite, je pensais au départ que c'était une amélioration de comparer la longueur des chaînes avant de comparer directement les chaînes, mais le temps sans le débogueur me donne tord :
3 101 ms avec le débogueur
901 ms sans le débogueur

Code : Tout sélectionner

;Cette commande m'oblige à déclarer préalablement toutes les variables que j'utilise
EnableExplicit

;-Initialisations
;{

Enumeration
  #FileName
  #FileCharName
EndEnumeration
Enumeration
  #MissName=0
  #FirstName=1
  #Surname=2
EndEnumeration

;Structure simple permettant de faire correspondre un
;Identifiant interne du programme (In$) avec un nom
;Externe (Out$) qui apparaitra sur l'interface utilisateur
Structure name
  In$
  Out$
EndStructure

;Structure complexe permettant de classer les différents
;Possibles des personnages avec d'autres informations
Structure charname Extends name
  Faction$
  Type.b
EndStructure

;Structure de l'empreinte CRC32
Structure crc32
  Left.w
  Right.w
EndStructure

;Structure d'un noeud
Structure node
  *Address
  *Next.node
EndStructure

Dim CRC32Table.node(65535) ;Tableau temporaire avec une partie des codes CRC32 possibles (512 Mo)

NewList Names.name()
NewList CharNames.charname()

Define String$,Faction$
Define Time.q
Define Type.w,Length.w,Number.w
Define *Address
Define *Node.node,CRC32.crc32

Declare.q Ticks()

;}

;-Macros

;Lecture d'un fichier au format .txt.strings.bin
Macro ReadStringsBin(FILE,NAMES,TYPE,LENGTH,NUMBER,ADDRESS)
  ;FILE est la constante qui identifie le fichier à lire
  ;NAMES doit être une liste chaînée avec une Structure comprenant les champs In$ et Out$ (comme name)
  ;TYPE, LENGTH et NUMBER doivent être des words .w
  ;ADDRESS est un pointeur mémoire de type *Address
  
  ;Initialisation
  TYPE=-4
  ;Boucle de lecture du bin
  While Not Eof(FILE)
    ;Longueur à lire
    LENGTH=ReadWord(FILE)
    ;Nombre d'entités à lire
    If TYPE=-2 : NUMBER=LENGTH*2 : EndIf
    ;Si la longueur n'est pas nulle
    If LENGTH
      ;Si on a dépassé l'entête
      If TYPE>-1
        ;Sélection du cas : In=0 et Out=1
        Select TYPE%2
          Case 0
            ;Ajoute un élément
            AddElement(NAMES)
            ;Allocation de mémoire pour la chaîne de caractère
            ADDRESS=AllocateMemory(LENGTH*2+1) ;+1 octet, important à la fin de toute chaîne de caractère
            ;Lecture effective de la chaîne
            ReadData(FILE,ADDRESS,LENGTH*2)
            ;On met un zéro pour signaler la fin de la chaîne de caractère
            PokeW(ADDRESS+LENGTH*2,0)
            ;Stockage de la chaîne de caractère ainsi créée
            NAMES\In$=PeekS(ADDRESS,LENGTH*2+1,#PB_Unicode) ;Format unicode, très important
            ;Libération de la mémoire temporaire, important
            FreeMemory(ADDRESS)
          Case 1
            ;Même procédure que ci-dessus
            ADDRESS=AllocateMemory(LENGTH*2+1)
            ReadData(FILE,Address,LENGTH*2)
            PokeW(ADDRESS+LENGTH*2,0)
            NAMES\Out$=PeekS(ADDRESS,LENGTH*2+1,#PB_Unicode)
            FreeMemory(ADDRESS)
        EndSelect
      EndIf
    EndIf
    ;Incrémentation automatique
    TYPE+1
    ;Si toutes les entités ont été lues, on quitte la boucle avant la fin du fichier
    If TYPE=NUMBER : Break : EndIf
  Wend
EndMacro

;Nettoyage complet d'une chaîne de caractères
Macro ClearString(STRING)
  ;Remplacement des tabulations par des espaces
  ReplaceString(STRING,Chr(9)," ",2)
  ;Suppression des commentaires
  If FindString(STRING,";",1) : STRING=Left(STRING,FindString(STRING,";",1)-1) : EndIf
  ;Suppression des espaces devant et derrière
  STRING=Trim(STRING)
EndMacro

;Suppression de la première partie d'une chaîne (il ne reste que l'argument)
Macro Argument(STRING,LENGTH)
  STRING=Trim(Mid(STRING,LENGTH+1))
EndMacro

;-Lecture des fichiers

;Fichier de données sur les noms de personnages (uniquement sous forme d'identifiants)
ReadFile(#FileCharName,"descr_names.txt")

While Not Eof(#FileCharName)
  
  ;Lecture et nettoyage
  String$=ReadString(#FileCharName,#PB_Ascii)
  ClearString(String$)
  If String$="" : Continue : EndIf
  
  If Left(String$,8)="faction:"
    Argument(String$,8)
    Faction$=String$
  ElseIf String$="characters" : Type=#FirstName
  ElseIf String$="women" : Type=#MissName
  ElseIf String$="surnames" : Type=#Surname
  Else
    AddElement(CharNames())
    CharNames()\In$=String$
    CharNames()\Faction$=Faction$
    CharNames()\Type=Type
  EndIf
Wend

CloseFile(#FileCharName)

;Ouverture du fichier spécifique à la langue du jeu vidéo
;Faisant correspondre les identifiants internes avec les noms
;Externes visibles sur l'interface utilisateur

ReadFile(#FileName,"names.txt.strings.bin")
ReadStringsBin(#FileName,Names(),Type,Length,Number,*Address)
CloseFile(#FileName)

;-Recherche des identifiants
;*****************************************************************************************

;Pour le temps
Time=Ticks()

;Par convention, les espaces sont équivalents aux tirets-bas
ForEach Names()
  Names()\In$=ReplaceString(Names()\In$,"_"," ")
Next

;Correspondance avec les identifiants internes
ForEach CharNames()
  
  Type=1
  String$=ReplaceString(CharNames()\In$,"_"," ")
  Length=Len(String$)
  
  ;Recherche brute dans la liste
  ForEach Names()
    ;Comparaison des tailles, permet de gagner un peu de temps
    If Length<>Len(Names()\In$) : Continue : EndIf
    ;Comparaison des chaînes
    If  String$=Names()\In$
      CharNames()\Out$=Names()\Out$
      Type=0
      Break
    EndIf
  Next
  
  ;Vérification qu'un nom externe a bien été retrouvé
  If Type
    MessageRequester("Erreur !","L'identifiant '"+CharNames()\In$+"' ne correspond à aucun nom !")
  EndIf
  
Next

;Il vaut mieux compiler le programme
;Plutôt que d'utiliser le débogueur
;Debug Ticks()-Time
MessageRequester("Information","Temps : "+Str(Ticks()-Time)+" ms !")

;*****************************************************************************************

;-Procédures

;Chronomètre de précision
Procedure.q Ticks()
  Protected Freq.q,Time.q
  QueryPerformanceFrequency_(@Freq)
  Freq=Freq/1000
  QueryPerformanceCounter_(@Time)
  ProcedureReturn Time/Freq
EndProcedure
Et enfin avec la table de hachage :
17 ms avec le débogueur !!!!
9 ms sans le débogueur !!!!

Code : Tout sélectionner

;Cette commande m'oblige à déclarer préalablement toutes les variables que j'utilise
EnableExplicit

;-Initialisations
;{

Enumeration
  #FileName
  #FileCharName
EndEnumeration
Enumeration
  #MissName=0
  #FirstName=1
  #Surname=2
EndEnumeration

;Structure simple permettant de faire correspondre un
;Identifiant interne du programme (In$) avec un nom
;Externe (Out$) qui apparaitra sur l'interface utilisateur
Structure name
  In$
  Out$
EndStructure

;Structure complexe permettant de classer les différents
;Possibles des personnages avec d'autres informations
Structure charname Extends name
  Faction$
  Type.b
EndStructure

;Structure de l'empreinte CRC32
Structure crc32
  Left.w
  Right.w
EndStructure

;Structure d'un noeud
Structure node
  *Address
  *Next.node
EndStructure

Dim CRC32Table.node(65535) ;Tableau temporaire avec une partie des codes CRC32 possibles (512 Mo)

NewList Names.name()
NewList CharNames.charname()

Define String$,Faction$
Define Time.q
Define Type.w,Length.w,Number.w
Define *Address
Define *Node.node,CRC32.crc32

Declare.q Ticks()

;}

;-Macros

;Lecture d'un fichier au format .txt.strings.bin
Macro ReadStringsBin(FILE,NAMES,TYPE,LENGTH,NUMBER,ADDRESS)
  ;FILE est la constante qui identifie le fichier à lire
  ;NAMES doit être une liste chaînée avec une Structure comprenant les champs In$ et Out$ (comme name)
  ;TYPE, LENGTH et NUMBER doivent être des words .w
  ;ADDRESS est un pointeur mémoire de type *Address
  
  ;Initialisation
  TYPE=-4
  ;Boucle de lecture du bin
  While Not Eof(FILE)
    ;Longueur à lire
    LENGTH=ReadWord(FILE)
    ;Nombre d'entités à lire
    If TYPE=-2 : NUMBER=LENGTH*2 : EndIf
    ;Si la longueur n'est pas nulle
    If LENGTH
      ;Si on a dépassé l'entête
      If TYPE>-1
        ;Sélection du cas : In=0 et Out=1
        Select TYPE%2
          Case 0
            ;Ajoute un élément
            AddElement(NAMES)
            ;Allocation de mémoire pour la chaîne de caractère
            ADDRESS=AllocateMemory(LENGTH*2+1) ;+1 octet, important à la fin de toute chaîne de caractère
            ;Lecture effective de la chaîne
            ReadData(FILE,ADDRESS,LENGTH*2)
            ;On met un zéro pour signaler la fin de la chaîne de caractère
            PokeW(ADDRESS+LENGTH*2,0)
            ;Stockage de la chaîne de caractère ainsi créée
            NAMES\In$=PeekS(ADDRESS,LENGTH*2+1,#PB_Unicode) ;Format unicode, très important
            ;Libération de la mémoire temporaire, important
            FreeMemory(ADDRESS)
          Case 1
            ;Même procédure que ci-dessus
            ADDRESS=AllocateMemory(LENGTH*2+1)
            ReadData(FILE,Address,LENGTH*2)
            PokeW(ADDRESS+LENGTH*2,0)
            NAMES\Out$=PeekS(ADDRESS,LENGTH*2+1,#PB_Unicode)
            FreeMemory(ADDRESS)
        EndSelect
      EndIf
    EndIf
    ;Incrémentation automatique
    TYPE+1
    ;Si toutes les entités ont été lues, on quitte la boucle avant la fin du fichier
    If TYPE=NUMBER : Break : EndIf
  Wend
EndMacro

;Nettoyage complet d'une chaîne de caractères
Macro ClearString(STRING)
  ;Remplacement des tabulations par des espaces
  ReplaceString(STRING,Chr(9)," ",2)
  ;Suppression des commentaires
  If FindString(STRING,";",1) : STRING=Left(STRING,FindString(STRING,";",1)-1) : EndIf
  ;Suppression des espaces devant et derrière
  STRING=Trim(STRING)
EndMacro

;Suppression de la première partie d'une chaîne (il ne reste que l'argument)
Macro Argument(STRING,LENGTH)
  STRING=Trim(Mid(STRING,LENGTH+1))
EndMacro

;-Lecture des fichiers

;Fichier de données sur les noms de personnages (uniquement sous forme d'identifiants)
ReadFile(#FileCharName,"descr_names.txt")

While Not Eof(#FileCharName)
  
  ;Lecture et nettoyage
  String$=ReadString(#FileCharName,#PB_Ascii)
  ClearString(String$)
  If String$="" : Continue : EndIf
  
  If Left(String$,8)="faction:"
    Argument(String$,8)
    Faction$=String$
  ElseIf String$="characters" : Type=#FirstName
  ElseIf String$="women" : Type=#MissName
  ElseIf String$="surnames" : Type=#Surname
  Else
    AddElement(CharNames())
    CharNames()\In$=String$
    CharNames()\Faction$=Faction$
    CharNames()\Type=Type
  EndIf
Wend

CloseFile(#FileCharName)

;Ouverture du fichier spécifique à la langue du jeu vidéo
;Faisant correspondre les identifiants internes avec les noms
;Externes visibles sur l'interface utilisateur

ReadFile(#FileName,"names.txt.strings.bin")
ReadStringsBin(#FileName,Names(),Type,Length,Number,*Address)
CloseFile(#FileName)

;-Recherche des identifiants
;*****************************************************************************************

;Pour le temps
Time=Ticks()

;Petite boucle me permettant de classer les identifiants
;Dans la mémoire RAM (quelque part dans CRC32Table)
ForEach Names()
  ;Les underscores et les espaces ont la même valeur, c'est juste une convention
  Names()\In$=ReplaceString(Names()\In$,"_"," ")
  String$=Names()\In$
  ;Attribution d'un emplacement mémoire correspondant à un code CRC32
  PokeL(@CRC32,CRC32Fingerprint(@String$,Len(String$)))
  ;J'ajoute 32768 au code CRC32 parce qu'il me faut un nombre positif
  *Node=CRC32Table(CRC32\Left+32768)
  ;Tant que cet emplacement mémoire est occupé
  While *Node\Address
    ;Tant qu'il existe un prochaine élément
    While *Node\Next
      ;Element suivant
      *Node=*Node\Next
    Wend
    *Node\Next=AllocateMemory(SizeOf(node))
    *Node=*Node\Next
  Wend
  ;Attribution de l'emplacement mémoire définitif
  *Node\Address=@Names()
Next

;Correspondance avec les identifiants internes
ForEach CharNames()
  
  ;Recherche dans la table CRC32
  Type=1
  String$=ReplaceString(CharNames()\In$,"_"," ")
  PokeL(@CRC32,CRC32Fingerprint(@String$,Len(String$)))
  
  *Node=CRC32Table(CRC32\Left+32768)
  While *Node\Address
    ;Test de la valeur en cours
    ChangeCurrentElement(Names(),*Node\Address)
    If Names()\In$=String$
      CharNames()\Out$=Names()\Out$
      Type=0
      Break
    EndIf
    ;Noeud suivant
    If *Node\Next : *Node=*Node\Next : EndIf
  Wend
  
  ;Vérification qu'un nom externe a bien été retrouvé
  If Type
    MessageRequester("Erreur !","L'identifiant '"+CharNames()\In$+"' ne correspond à aucun nom !")
  EndIf
  
Next

;Il vaut mieux compiler le programme
;Plutôt que d'utiliser le débogueur
;Debug Ticks()-Time
MessageRequester("Information","Temps : "+Str(Ticks()-Time)+" ms !")

;*****************************************************************************************

;-Procédures

;Chronomètre de précision
Procedure.q Ticks()
  Protected Freq.q,Time.q
  QueryPerformanceFrequency_(@Freq)
  Freq=Freq/1000
  QueryPerformanceCounter_(@Time)
  ProcedureReturn Time/Freq
EndProcedure
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

@Octavius

Je vois "512Mo" en commentaire près du tableau. Est-ce que tu peux donner un petit explicatif de ta méthode. J'ai du mal à la saisir. ça me semble beaucoup 512Mo. Et 19Ms aussi est une valeur qui me semble encore un peu trop grande. Qu'est-ce que t'en penses?

Sinon, sur le principe, c'est nickel.

Ollivier
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Message par Octavius »

Eh bien 9 ms c'est quand même 35 fois plus rapide que 315 ms, donc ça me semble pas mal ! Aurais-tu une idée pour améliorer ça ?

Sinon pour le 512 Mo c'est une petite erreur d'unité, en réalité c'est 512 ko : j'ai un tableau avec 65536 emplacements réservés pour une structure de 2 Long (soit 2*4 octets), ce qui fait au total 524 288 octets réservés dans la RAM pour ce tableau, soit 512 ko ( 1 ko = 1024 octets ).
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Ah! Okay! Dans ce cas, c'est vrai que 512Ko, ça n'est pas énorme. Tu as donc fait une table sur 16 bits. Dans ce cas, c'est une bonne solution.

Si tu veux augmenter la vitesse de recherche, tu peux faire une table sur 24 bits (128Mo). C'est vrai que c'est pas mal mais si tu as besoin de quelque chose de rapide, il vaut peut-être mieux sacrifier ces 128Mo.

En attendant, c'est nickel.

Ollivier
Répondre