begin process at 2012 02 04 12:23:51
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Optimisation du code

 > ALTERNATIVE À LA FUNCTION VBA OU VB REPLACE (JUSQU'À 10 FOIS PLUS VITE, SANS API)

ALTERNATIVE À LA FUNCTION VBA OU VB REPLACE (JUSQU'À 10 FOIS PLUS VITE, SANS API)


 Information sur la source

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Optimisation du code Classé sous :Replace, Optimisation, Astuces Niveau :Débutant Date de création :08/02/2010 Vu / téléchargé :3 490 / 291

Auteur : vicosta

Ecrire un message privé
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
J'ai trouvé cette fonction dans le forum Bigsource. Comme je n'ai pas trouvé d'équivalent si rapide sur VBFrance, j'ai du alors fabriquer cette feuille pour le test que s'assevère positif.

Source

  • C'est mieux faire le test aussi
C'est mieux faire le test aussi


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture CONVERTIR DU TEXTE RTF EN CODE HTML ET VICE-VERSA
Source avec Zip DÉMANDER AUTOMATIQUEMENT LES DROITS ADMINISTRATEUR POUR VOTR...
Source avec Zip TRADUIRE DES GROS CHIFFRES EN LETTRES AVEC CORRECTION ORTOGR...
Source avec Zip Source avec une capture INTERCOMMUNICATION ENTRE APPLICATIONS SANS DLL, OCX NI SUBCL...
Source avec Zip Source avec une capture IDE EVAL (CALCULER AVEC TRÉS PEU DE CODE)

 Sources de la même categorie

Source avec Zip FONCTIONS PRATIQUE POUR LISTVIEW par Galactus13
Source avec une capture Source .NET (Dotnet) HISTOGRAMME - SUITE - GRAPHIQUE DE BARRES VERTICALES POUR UN... par tchconst
Source .NET (Dotnet) HISTOGRAMME (BIS) BARRES VIA DATATABLE 100 % PERSONNALISÉ par tchconst
Source avec une capture Source .NET (Dotnet) AFFICHER UN HISTOGRAMME PERSONNALISÉ par tchconst
Source avec une capture Source .NET (Dotnet) PROFIL BINAIRE D'UN OBJET par tchconst

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) CLOSESQUARE NOUVELLE VERSION par ShayW
Source avec Zip Source avec une capture EXTRACTION DES CHAINES ENTRE GUILEMETS ET CREATION D'UN POIN... par ccgousset
Source avec Zip Source avec une capture Source .NET (Dotnet) ASTUCES POUR WINDOWS VISTA par PHILOUVB
Source avec Zip OPÉRATIONS SUR LES CHAINES DE CARACTÈRE OPTIMISÉES ET ÉTENDU... par MadM@tt
Source avec Zip Source avec une capture PERFORMANCE MEASURER par Psg2

Commentaires et avis

Commentaire de JJDai le 09/02/2010 20:46:00

Si effectivement dans certains contextes cette fonction s'avère plus rapide dans d'autres elle l'est moins, et au finale je ne suis pas convaincu car la plus part du temps il suffit de revoir algorithmie principale notamment la construction des boucles.

Un test avec
c = Replace(c, "co", "mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm", 1, , 1)
c = Replace(c, "mm", "ttttttttttttttttttttttttttttttttttttttttttttt", 1, , 1)
c = Replace(c, "tt", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", 1, , 1)
c = Replace(c, "bb", "zzzzzzZZZzzzzzzzzzzzzzzzzzzZZZZZZzzzz", 1, , 1)
c = Replace(c, "zz", "oooooooooooooooooooooooooooo", 1, , 1)
c = Replace(c, "zzzzz", "visual basic", 1, , 1)

S'avère presque équivalent sur mon poste.

Cependant très bonne source pour les version antérieures de VB et VBA qui n'implémente pas cette fonction.
JJDAI

Commentaire de vicosta le 09/02/2010 21:34:00

Sur mon poste et avec l'exemple de code que tu décris, ça va plus de 10 fois plus vite.
Bien sûr que, si le project ne comporte pas beaucoup de remplacements à éffectuer, cette function sera superflue.

Commentaire de us_30 le 10/02/2010 15:15:55

Il y a un certain nombre de code sur REPLACE sur VBF... (et j'en parle pas sur internet). As-tu fait le test du plus rapide au moins ? Simple curiosité...

Amicalement,
Us.

Commentaire de vicosta le 11/02/2010 02:43:11

Pas besoin de tester les autres codes sur vbfrance, j'ai consulté une bonne dizainne parmi le plus récents et aucun, tel que VB, ne reserve de la mémoire addctionnel pour travailler confortablement sans trop embarasser le système d'exploitation.

Commentaire de BruNews le 11/02/2010 14:02:29 administrateur CS

"...ne reserve de la mémoire addctionnel pour travailler confortablement sans trop embarasser le système d'exploitation.".

En terme simple et surtout informatiquement, ça donne quoi ?

Commentaire de vicosta le 12/02/2010 01:56:15

Ctd qu'à chaque manipulation de chainnes dont sa longueur se modifie considérablement, vb fait appel à une réserve de mémoire addictionnelle, ou à une liberation de cette mémoire comme c'est logique.
Parfois cet emplacement de mémoire est même déplacé par manque de place continue ce que fait augmenter encore d'avantage le temps de traitement sur la chainne. C'est pour ça que VB est lent, alors on doit appliquer les astuces.

Voici deux exemples qui provoquent le même résultat, plus ou moins vite:

Avec réservation de mémoire: Temps= 125 ms
C = Space(500000): For I = 1 To 500000: Mid$(C, I, 1) = Chr(I Mod 255): Next

Sans réservation de mémoire: Temps= 92626 ms  !!!!!!
For I = 1 To 500000: C = C & Chr(I Mod 255): Next

Désolé je ne peux pas être plus simple

Dans la pratique ça peut se simplifier comme ça:
Exemple1: for i=1 to 500000: a = a & chr(i mod 255):next





Commentaire de BruNews le 12/02/2010 10:15:20 administrateur CS

C'est déjà un peu plus clair.
mémoire addictionnelle = alloc mémoire (ici HeapAlloc).

1er algo:
1 seule alloc et affectation des octets.

2eme algo:
JUSQUE 500000: BEGIN
- alloc(LEN + 1);
- recopie de LEN octets;
- affectation du dernier octet;
- désalloc (HeapFree) de l'ancien bloc;
END

C'était pas pour pinailler mais les mots sont très importants.
S'ils permettent de mieux expliquer, ils nous aident surtout à mieux structurer et donc résoudre parfaitement un problème.

Si tu veux voir ce qui se passe en interne (sans VM):
REMPLACE DANS TOUTE UNE CHAINE
http://www.cppfrance.com/code.aspx?id=23920

Commentaire de us_30 le 12/02/2010 11:44:46

Donc malgré tout, c'est bien l'optimisation de performance qui est recherché...

Comme j'ai trouvé l'équivalent plus rapide sur VBFrance, voici l'adresse :
http://www.vbfrance.com/codes/OPERATIONS-SUR-CHAINES-CARACTERE-OPTIMISEES-ETENDUES_49069.aspx

En reprenant les tests, la fonction StrReplace est encore 2 fois plus rapide que celle proposée ici.

Amicalement,
Us.

Commentaire de vicosta le 12/02/2010 20:00:01

@ Brunnews: très bien vu, je pense que sur C+ ça va encore plus vite, dommage que je suis presque trop vieux pour m'y mettre.

@ US_30: merci pour le lien, j'ai testé, StrReplace ça va deux fois plus vite que VBReplace, et 20 fois plus vite que la function standard Replace


Commentaire de bernan le 15/02/2010 10:21:09

Ou alors, il y a aussi :

Function ReplaceStr(TextIn, SearchStr, Replacement)
If IsNull(SearchStr) Or SearchStr = "" Then
    ReplaceStr = TextIn
    Exit Function
End If
On Error GoTo 0
If IsNull(Replacement) Then Replacement = ""
Dim WorkText As String, Pointer As Double
  If IsNull(TextIn) Then
    ReplaceStr = Null
  Else
    WorkText = TextIn
    Pointer = InStr(1, WorkText, SearchStr)
    Do While Pointer > 0
      WorkText = left(WorkText, Pointer - 1) & Replacement & Mid(WorkText, Pointer + Len(SearchStr))
      Pointer = InStr(Pointer + Len(Replacement), WorkText, SearchStr, CompMode)
    Loop
    ReplaceStr = WorkText
  End If
End Function

Commentaire de BruNews le 15/02/2010 12:41:02 administrateur CS

Pointer As Long

Commentaire de us_30 le 15/02/2010 13:33:14

Ouais, ben, si il y avait que ça... CompMode vaut quoi ? Le typage de Textin, SeachStr, Replacement sont variant... et pis, aucune optimisation... Toutes les options de Replace ne sont pas présente. Sans compter le genre de truc qui sert à rien : If IsNull(Replacement) Then Replacement = ""... Utiliser IsMissing, ou mieux une valeur par défaut nulle dans les paramètres... etc.

J'ai testé (enfin, si on peut dire) cette proposition, et, j'ai arrêté tout sauvagement VB6, faute de patience...

=

Sinon, le code de VICOSTA est optimisable déjà en utilisant les mêmes types d'optimisation que dans StrRapelace... Entre autre : utiliser LenB, InstrB...

Amicalement,
Us.

Commentaire de Norpac le 21/02/2010 11:34:17 8/10

L'instruction :
ReDim Preserve alHits(0 To lSize) As Long
prend environ 40 % du temps d'exécution. Pourquoi ne pas calculer la taille de ce tableau au préalable et n'effectuer le dimensionnement qu'une seule fois. Cela oblige à dupliquer quelques instructions mais s'avère payant. J'arrive à un rapport de 300 ms pour 16000 ms sur le même exemple.
Toujours impressionné par le travail de passionnés anonymes.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Fonction Replace [ par Brodeur ] Bonjour, est-ce que quelqun pourrais m'expliquer le fonctionnenent de fonction Replace (remplacer un caractere dans un texte) avec un exemple.Applis Fonction Replace !!!(VB) [ par flash ] Bonjour,Voila un petit moment que je bloque sur la fonction Replace(Remplace certains caractères dans une chaîne de caractères)Je souhaiterai remplace codage optimisation non linéaire(kuhn tucker) système équations en particulier [ par mamok ] nous avons un problème pour coder le système pour rsoudre un pb d'optim non lineaire(kuhn tucker). Nous arrivons à coder dériver mais après pour résou Fonction Replace [ par PaulScholes ] Je fais du visual basic sous access97, et apparament, la fonction replace n'est pas reconnue, j'ai essayé mon code sous excel2000 ( mon application ex fonction replace [ par ElMagnifico ] Existe t-il un équivalent à la fonction replace de Visual Basic en VBA? y a t il un equivalent de la fct php str_replace en VB ? [ par laglobule ] Ben voila, c marké dans le titreEn fait, j'ai une string avec des ";" dedans et je voudrais remplacer ces ; par la constante vbCrLf...mici pour la rep REPLACE(STRING,,....) PROBLÈME AVEC DES CHAINES DE PLUS DE 1200 CARACTÈRES.... [ par fliot ] Bonjour,Je ne comprends pas très bien, en utilisant : strData = Replace(strData, "toto", "tata", , , vbTextCompare) J'ai bien un changement de "toto problème sur un Replace(......) ! help me !! [ par minipod ] Mon Replace ne change rien dans ma base !! Il me donne la chaine de caractère telle qu'elle était sans opérer de modif ! Voilà mon code ! Si quelqu'un


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,889 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales