Overblog Suivre ce blog
Editer l'article Administration Créer mon blog

Présentation

  • : Romagny13 - Du .NET,du pur .NET
  • Romagny13 - Du .NET,du pur .NET
  • : Cycle de progression Faire (quelque chose qui marche) -> comprendre ce que l’on fait/comment cela marche -> pousser plus loin les notions
  • Contact

Recherche

Articles Récents

8 juin 2007 5 08 /06 /juin /2007 20:09
Créer une dll afin d’améliorer les performances de traitement d’une expression régulière
Pour une application (éditeur avec coloration syntaxique) j’essaie de trouver tout ce qui me permettrait de gagner en performance, et notamment au chargement de fichier de taille conséquente (5000 lignes)
Dernière tentative en date > compilation d’une dll contenant la regex à utiliser, il parait que l’on peut gagner la moitié de temps en performance .. bof je ne l’ai pas encore verifié 
            string Keywords = @"(?<=s|{|}|(|)|,|=|^)(ABSOLUTE|ACTION|ADD|ALL|ALLOCATE|ALTER|AND|ANY|ARE|AS|ASC|ASSERTION|AT|AUTHORIZATION|AVG|BEGIN|BETWEEN|BIT|BIT_LENGTH|BOTH|BY|CASCADE|CASCADED|CASE|CAST|CATALOG|CHAR|CHARACTER|CHAR_LENGTH|CHARACTER_LENGTH|CHECK|CLOSE|COALESCE|COLLATE|COLLATION|COLUMN|COMMIT|CONNECT|CONNECTION|CONSTRAINT|CONSTRAINTS|CONTINUE|CONVERT|CORRESPONDING|COUNT|CREATE|CROSS|CURRENT|CURRENT_DATE|CURRENT_TIME|CURRENT_TIMESTAMP|CURRENT_USER|CURSOR|DATE|DAY|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFERRABLE|DEFERRED|DELETE|DESC|DESCRIBE|DESCRIPTOR|DIAGNOSTICS|DISCONNECT|DISTINCT|DOMAIN|DOUBLE|DROP|ELSE|END|END-EXEC|ESCAPE|EXCEPT|EXCEPTION|EXEC|EXECUTE|EXISTS|EXTERNAL|EXTRACT|FALSE|FETCH|FIRST|FLOAT|FOR|FOREIGN|FOUND|FROM|FULL|GET|GLOBAL|GO|GOTO|GRANT|GROUP|HAVING|HOUR|IDENTITY|IMMEDIATE|IF|IN|INDICATOR|INITIALLY|INNER|INPUT|INSENSITIVE|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|IS|ISOLATION|JOIN|KEY|LANGUAGE|LAST|LEADING|LEFT|LEVEL|LIKE|LOCAL|LOWER|MATCH|MAX|MIN|MINUTE|MODULE|MONTH|NAMES|NATIONAL|NATURAL|NCHAR|NEXT|NO|NOT|NULL|NULLIF|NUMERIC|OCTET_LENGTH|OF|ON|ONLY|OPEN|OPTION|OR|ORDER|OUTER|OUTPUT|OVERLAPS|PAD|PARTIAL|POSITION|PRECISION|PREPARE|PRESERVE|PRIMARY|PRIOR|PRIVILEGES|PROCEDURE|PUBLIC|READ|REAL|REFERENCES|RELATIVE|RESTRICT|REVOKE|RIGHT|ROLLBACK|ROWS|SCHEMA|SCROLL|SECOND|SECTION|SELECT|SESSION|SESSION_USER|SET|SIZE|SMALLINT|SOME|SPACE|SQL|SQLCODE|SQLERROR|SQLSTATE|SUBSTRING|SUM|SYSTEM_USER|TABLE|TEMPORARY|THEN|TIME|TIMESTAMP|TIMEZONE_HOUR|TIMEZONE_MINUTE|TO|TRAILING|TRANSACTION|TRANSLATE|TRANSLATION|TRIM|TRUE|UNION|UNIQUE|UNKNOWN|UPDATE|UPPER|USAGE|USER|USING|VALUE|VALUES|VARCHAR|VARYING|VIEW|WHEN|WHENEVER|WHERE|WITH|WORK|WRITE|YEAR|ZONE)b";
            System.Text.RegularExpressions.RegexCompilationInfo oRegexCompilationInfo = new System.Text.RegularExpressions.RegexCompilationInfo(Keywords, System.Text.RegularExpressions.RegexOptions.IgnoreCase, "SQLEditorRegex", "SQLEditorRegex", true);
            System.Text.RegularExpressions.RegexCompilationInfo[] oRegexCompilationInfos = new System.Text.RegularExpressions.RegexCompilationInfo[] { oRegexCompilationInfo };
            System.Reflection.AssemblyName oAssemblyName = new System.Reflection.AssemblyName();
            oAssemblyName.Name = "Regex";
            System.Text.RegularExpressions.Regex.CompileToAssembly(oRegexCompilationInfos, oAssemblyName);
 
Une dll lest donc créée, il suffit ensuite de faire appel à celle-ci, le code généré dans la dll est plus que conséquent
compilationregex.JPG
Utilisation  :
SQLEditorRegex.SQLEditorRegex oSQLEditorRegex;
 
           oSQLEditorRegex=new SQLEditorRegex.SQLEditorRegex();
 
// etc.
 
public void ColorLine(int offset, string sCurrentLine)
        {
            if (!this.Created)
            { }
            else
            {
                Int32 endpos = offset + sCurrentLine.Length;
                tom.ITextRange rg = this.ITextDocument.Range(offset, endpos);
                if (rg.Font.CanChange() != 0)
                {
                    rg.Font.ForeColor = ColorToRGB(System.Drawing.Color.Black);
                    rg.Font.BackColor = 16777215;
                }
                System.Collections.IEnumerator oEnum = oSQLEditorRegex.Matches(sCurrentLine).GetEnumerator();
                while (oEnum.MoveNext())
                {
                    System.Text.RegularExpressions.Match oMatch = (System.Text.RegularExpressions.Match)oEnum.Current;
                    rg.SetRange(offset + oMatch.Index, offset + oMatch.Index + oMatch.Length);
                    rg.Font.BackColor = 16777215;
                    rg.Font.ForeColor = ColorToRGB(System.Drawing.Color.Blue);
                }
            }
        }
 
 
Bon je ne suis encore satisfait, car avec un gros fichier à traiter, il me faut bien 5 à 10 secondes

Partager cet article

Repost 0
Published by Romagny13 - dans C 1.0- 2.0- 3.0
commenter cet article

commentaires