Overblog Tous les blogs Top blogs Économie, Finance & Droit Tous les blogs Économie, Finance & Droit
Editer l'article Suivre ce blog Administration + Créer mon blog
MENU

Cycle de progression Faire (quelque chose qui marche) -> comprendre ce que l’on fait/comment cela marche -> pousser plus loin les notions

Publicité

Créer une dll afin d’améliorer les performances de traitement d’une expression reguliere

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
Publicité
Retour à l'accueil
Partager cet article
Repost0
Pour être informé des derniers articles, inscrivez vous :
Commenter cet article