Accueil > Forum > > > > Défi: optimisation d'une fonction de convertion (Bin => Dec)
Défi: optimisation d'une fonction de convertion (Bin => Dec)
mardi 4 janvier 2005 à 14:47:52 |
Défi: optimisation d'une fonction de convertion (Bin => Dec)

lcprog
|
Salut!
J'ai besoin dans un programme d'avoir une fonction qui me converti en nombre entier une chaine de caractères représentative d'un nombre binaire strictement positif compris entre 0 et 511 ex: "100110100" (codage sur 9 bits).
Cette fonction doit être appelée environ 9 000 000 de fois à la suite. Il me faut donc qu'elle soit le plus rapide possible. Je poste la fonction que je me suis programmé mais que je voudrais optimiser. Si vous avez des idée pour augmenter la rapidité du code je vous serai reconnaissant. Merci!
Loïc
<code>
Private Function BinToNum(sBinary As String) As Long Dim nValue As Long Dim nCpt As Long Dim nPow As Byte nValue = 0 nCpt = 1 While nCpt <= Len(sBinary) If Mid(sBinary, nCpt, 1) = "1" Then nPow = Len(sBinary) - nCpt nValue = nValue + (2 ^ nPow) End If nCpt = nCpt + 1 Wend BinToNum = nValue End Function
</code>
|
|
mardi 4 janvier 2005 à 15:21:56 |
Re : Défi: optimisation d'une fonction de convertion (Bin => Dec)

Kazuya
|
Salut, j'ai déjà eut exactement le même genre de PB et j'ai trouvé une solution pas mal du tout, on ne peut pas faire plus rapide, c'est imposible. il te faut ecrire une fonction dans ce goût la: Private Function BinToNum(sBinary As String) As Long Select Case sBinary Case "000000000" BinToNum = 0 Case "000000001" BinToNum = 1 Case "000000010" BinToNum = 2 Case "000000011" BinToNum = 3 etc..... End Select End Function Oui mais tu va m'dire, hein, fo écrire tout ça, c'est trop long !!! C'est pourquoi moi, j'ai d'abord écrit un petit programme qui m'écrit la fonction toute faite dans un fichier puis je fais un copier/coller, c'est pas plus compliqué que ça. K@zuya 
|
|
mardi 4 janvier 2005 à 15:37:32 |
Re : Défi: optimisation d'une fonction de convertion (Bin => Dec)

Zigarn
|
Et si tu utilisait le même algo que pour convertir une chaine représentant un décimal en un entier :
tu lis tes caractères depuis la gauche et à chaque caractère tu multiplie par 2 et tu ajoute la valeur du caractère :
Private Function BinToNum(sBinary As String) As Long Dim nValue As Long Dim nCpt As Long
Dim nMax As Long
nMax = Len(sBinary)
nValue = 0 nCpt = 1 While nCpt <= nMax
nValue = 2*nValue If Mid(sBinary, nCpt, 1) = "1" Then nValue = nValue + 1 End If nCpt = nCpt + 1 Wend BinToNum = nValue End Function
C'est plus "algorithmique" come solution et tu n'utilise pas de calcul de puissance donc plus rapide que ta solution
------------------------------------------------- Débutant ... mais pas pour longtemps !
|
|
mardi 4 janvier 2005 à 15:41:00 |
Re : Défi: optimisation d'une fonction de convertion (Bin => Dec)

Zigarn
|
En fait cela utilise le fait que 100110b = ((((1*2+0)*2+0)*2+1)*2+1)*2+0
tout comme 123 = (1*10+2)*10+3
------------------------------------------------- Débutant ... mais pas pour longtemps !
|
|
mardi 4 janvier 2005 à 16:23:52 |
Re : Défi: optimisation d'une fonction de convertion (Bin => Dec)

lcprog
|
la solution de Kazuya me plait bien. je testerai ce soir... Sinon un gars sur hardware.fr m'a beaucoup aidé. Voici où on a abouti (presque 50% de gain de temps).
private nPowerArray(1 to 9) as long Private Function Bin9BitsToNum(sBinary As String) As Long Dim nValue As Long Dim nCpt As Long nValue = 0 nCpt = 9 While nCpt > 0 If AscW(Mid$(sBinary, nCpt, 1)) = 49 Then nValue = nValue + nPowerArray(nCpt) End If nCpt = nCpt - 1 Wend Bin9BitsToNum = nValue End Function Private Sub Class_Initialize() nLevel = 1 nPowerArray(1) = 256 nPowerArray(2) = 128 nPowerArray(3) = 64 nPowerArray(4) = 32 nPowerArray(5) = 16 nPowerArray(6) = 8 nPowerArray(7) = 4 nPowerArray(8) = 2 nPowerArray(9) = 1 End Sub
|
|
mardi 4 janvier 2005 à 16:44:18 |
Re : Défi: optimisation d'une fonction de convertion (Bin => Dec)

JoePatent
|
" Salut, j'ai déjà eut exactement le même genre de PB et j'ai trouvé une solution pas mal du tout, on ne peut pas faire plus rapide, c'est imposible."
Cette solution n'est pas la plus rapide. Chaque 'case' sera verifier dans le cas de 511 par exemple. Tant qu'a procéder ainsi, fait 9 if indépendant pour tester chaque BIT un a un. Plus rapide, plus simple, plus court, plus stable. Toujours et uniquement 9 conditions. Aucune boucle, aucune incémentation de variable etc etc. ***** LCPROG -> tu semble hardcodé le nombre de bit a 9 si je me fie au vecteur. Donc... Private Function Bin9BitsToNum(sBinary As String) As Integer Dim nValue As Integer ' Prit la liberté de réduire la taille des variable Dim nCpt As Integer ' Prit la liberté de réduire la taille des variable nValue = val(right&(sBinary, 1) ' Tant qu'a initialiser aussi bien couper une itération for nCpt = 8 to 1 step -1 ' Pas convaincu que cette boucle est plus performante nValue = nValue + (nPowerArray(nCpt) * val(mid$(sBinary, nCpt, 1))) next j Bin9BitsToNum = nValue End Function Private Sub Class_Initialize() nLevel = 1 ' ??? nPowerArray(1) = 256 nPowerArray(2) = 128 nPowerArray(3) = 64 nPowerArray(4) = 32 nPowerArray(5) = 16 nPowerArray(6) = 8 nPowerArray(7) = 4 nPowerArray(8) = 2 nPowerArray(9) = 1 End Sub [ Lien ]
|
|
mardi 4 janvier 2005 à 16:58:15 |
Re : Défi: optimisation d'une fonction de convertion (Bin => Dec)

lcprog
|
Voilà où j'en suis. J'ai pas trouvé plus rapide.
Private Function Bin9BitsToNum(sBinary As String) As Long Dim nValue As Long If AscW(Mid$(sBinary, 1, 1)) = 49 Then nValue = nValue + 256 End If If AscW(Mid$(sBinary, 2, 1)) = 49 Then nValue = nValue + 128 End If If AscW(Mid$(sBinary, 3, 1)) = 49 Then nValue = nValue + 64 End If If AscW(Mid$(sBinary, 4, 1)) = 49 Then nValue = nValue + 32 End If If AscW(Mid$(sBinary, 5, 1)) = 49 Then nValue = nValue + 16 End If If AscW(Mid$(sBinary, 6, 1)) = 49 Then nValue = nValue + 8 End If If AscW(Mid$(sBinary, 7, 1)) = 49 Then nValue = nValue + 4 End If If AscW(Mid$(sBinary, 8, 1)) = 49 Then nValue = nValue + 2 End If If AscW(Mid$(sBinary, 9, 1)) = 49 Then nValue = nValue + 1 End If Bin9BitsToNum = nValue End Function
JoePatent, t'es sur pour l'integer ? J'ai lu qu'il fallait de préférence utiliser le tupe long en vb pour les processeurs 32 bits. Faut pas regarder la variable nLevel, c'est une propriété utilisée dans les autres méthodes de ma classe.
|
|
mardi 4 janvier 2005 à 17:03:01 |
Re : Défi: optimisation d'une fonction de convertion (Bin => Dec)

lcprog
|
je confirme pour le long. ca me fait gagner 1.5 seconde sur un bench qui dure 43 secondes avec un integer
|
|
mardi 4 janvier 2005 à 17:03:40 |
Re : Défi: optimisation d'une fonction de convertion (Bin => Dec)

lcprog
|
je confirme pour le long. ca me fait gagner 1.5 seconde sur un bench qui dure 43 secondes avec un integer
|
|
mardi 4 janvier 2005 à 18:30:30 |
Re : Défi: optimisation d'une fonction de convertion (Bin => Dec)

Gobillot
|
l'accès direct est toujours le plus rapide, bien sûr ça prend énormément de place mais ensuite les temps sont negligeables.
Dim s As String Dim i As Integer Dim T() As Integer
ReDim T(111111111) For i = 0 To 511 s = Byte2String(i) T(Val(s)) = i Next
Private Function Byte2String(n As Integer) As String Dim x As Integer Dim R As String x = 256 Do If (n And x) Then R = R + "1" Else R = R + "0" x = x \ 2 Loop Until x = 0 Byte2String = R End Function
'pour l'utilsation accès directe dans la Table Bin9BitsToNum = T(Val(sBinary))
Daniel
|
|
Cette discussion est classée dans : fonction, long, ncpt, nvalue, sbinary
Répondre à ce message
Sujets en rapport avec ce message
la fonction bitblt sou win2000 [ par beniboun ]
Quelqu'un saurait-il comment fonctionne la fonction Bitblt de GDI32.dll sous Windows 2000 ?Cet appel de fonction fonctionne correctement sous win95/98
Besoin aide sur fonction Min et Max dans Macro Excel [ par Baboune ]
Bonjour,je voudrai utiliser la fonction Min et Max suivante de TomAmplius mais je n'y comprend rien !Je voudrai aussi l'associer avec la fonction de c
Pb d'utilisation de la fonction AvifileOpen en VB# [ par tlesol ]
Bonjour a tous,J'ai un problème sur l'execution de la fonction AvifileOpen en VB#Le script est le suivant : Private Declare Sub AVIFileInit Lib "avifi
Fonction qui renvoit un pointeur... [ par Nosk ]
SalutJ'ai un probleme en VB : J'ai une fonction qui devrait normallement renvoyer une string. Malheureusement, cette fonction renvoit une variable de
appel d'une fonction dans une dll [ par FMatrix07 ]
je ne vois pas trop comment faire si vous pouvez me donner un exemple concretpar exemple je veux utiliser la fontion CreateToolhelpSnapshot dans la dl
Fonction des DLL [ par jujeco ]
Je débute dans la programmation en VB6. J'utilise des sources que je trouve sur ce site et je les décortiques pour les comprandre. En général tout vas
parametres d'une fonction CreateService [ par lucio57 ]
Bonjour,J'utilise une fonction CreateService pour installer un service par code. Mon pb est que je ne comprends pas tous les parametres si quelqu'un p
[vb.net] Changer de wallpapers [ par bloodaxe ]
Salut tous, je viens demander conseil a des spécialiste de visual basic .net. J'ai fait un programme qui change le wallpaper de Windows (jusque la rie
[vb.net] Changer de wallpapers [ par bloodaxe ]
Salut tous, je viens demander conseil a des spécialiste de visual basic .net. J'ai fait un programme qui change le wallpaper de Windows (jusque la rie
Fonction BitBlt ??? [ par liban123 ]
Salut a tous!La fonction" bitblt (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC A
Livres en rapport
|
Derniers Blogs
DéMARRONS AVEC LES TASKSDéMARRONS AVEC LES TASKS par richardc
Que vous le vouliez ou non, le développement multi-tâche est maintenant une obligation pour toute nouvelle application. Il est donc vital d'en comprendre les mécanismes et de s'y mettre le plus tôt possible.
En attendant le .NET Framework 4.5 avec le...
Cliquez pour lire la suite de l'article par richardc SLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPSSLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPS par Vko
Retrouvez les slides et les démo de ma session Fast & Furious XAML Apps. A ceux qui se posent la question : "est-ce que le code de la DataGrid est disponible?", je vous répondrais "pas encore". Je vais mettre en place un projet codeplex pour part...
Cliquez pour lire la suite de l'article par Vko XNA IS DEAD!XNA IS DEAD! par richardc
Depuis la semaine dernière (et grâce aux TechDays 2012), je me penche activement sur la nouvelle version de Windows, aka Windows 8. Vous me direz, il était temps puisque la première preview date de Septembre dernier.
OK. Remarquez, on n'en est qu'aux...
Cliquez pour lire la suite de l'article par richardc TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 !TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 ! par ROMELARD Fabrice
Speakers: Fabrice Meillon et Stanislas Quastana Cette session est basée entièrement sur celle donnée lors de la BUILD cet hiver. Il n'y a pas d'ajout d'information en rapport avec cet évènement passé. Windows 8 Server sera intégralem...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [HTML5] AUTOUR DU W3C : NOUVEAUX STANDARDS ET WEB MOBILE (LILLE)[HTML5] AUTOUR DU W3C : NOUVEAUX STANDARDS ET WEB MOBILE (LILLE) par Gio
Je m'y prends un peu tard je sais, mais bon je suis développeur web et donc hyper fainéant ! Toujours dans le cadre des technologies émergentes, ici HTML5, parce qu'on aime HTML5 chez Wyg , nous seront présent, le vieux ( Aurélien V.) et moi, pour pr...
Cliquez pour lire la suite de l'article par Gio
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|