我正在使用C#。 NET 2.0和WinForms。
我有一段代码在Assembly中格式化,如下所示:
VARIABLE = 40
ADDRESS = $60
LDA VARIABLE;
STA ADDRESS;
输出应为:
!VARIABLE = 40
!ADDRESS = $60
LDA !VARIABLE;
STA !ADDRESS;
当然,还有更多。像2000行一样,但关键是文件顶部有声明,我可以加载/保存或用它们做任何事情。但我的问题是,我必须用!来“预装”所有这些声明(即使在原始代码中)。
我目前的方法是:
var defs = tab.tb.GetRanges(@"^\s*([A-Za-z0-9_]+){4,255}\s*=", RegexOptions.Multiline); // all declarations are formatted like this, so use regex to get all of them
foreach (var def in defs)
{
string actual = def.Text.Substring(0, def.Text.IndexOf(' ')); // remove the = sign since its not used in actual code
txt = txt.Replace(actual, "!" + actual);
}
但是,这种方法非常慢。 “修复”我文件中的所有声明大约需要3秒钟。有没有更好的方法?对于记录,语法与普通文本框略有不同,因为我使用http://www.codeproject.com/KB/edit/FastColoredTextBox_.aspx作为我的文本控件。
答案 0 :(得分:2)
我怀疑您的性能问题在于str
上的替换。 .NET中的字符串是不可变的,因此当您执行任何更改字符串的操作(追加,替换等)时,.NET必须创建一个新字符串并将旧字符串复制到其中(所有2000行),以及变化。尝试将字符串加载到StringBuilder
(这是可变的),并使用它的原生.Replace()方法。
答案 1 :(得分:2)
这是一个快速尝试。在我的机器上,它处理一个25000+行文件< 100毫秒。
但是,我只有两个样本值以此为基础;随着更多的替换操作,性能将下降。
更新:我尝试了另一个样本,这次有25000行和8个唯一值来修改。性能仅降低了几毫秒。
Stopwatch sw = new Stopwatch();
string text = File.ReadAllText( @"C:\\temp\so.txt" );
sw.Start();
// find the tokens we will be replacing
Regex tokenFinder = new Regex( @"^(([A-Za-z0-9_]+){4,255})\s*(=)", RegexOptions.Multiline );
// ensure uniqueness, and remove "=" by looking at the second match group
var tokens = ( from Match m in tokenFinder.Matches( text ) select m.Groups[1].Value ).Distinct();
// perform replace for each token...performance here will greatly vary based on the number of tokens to replace
foreach( string token in tokens )
{
Regex replaceRegex = new Regex( token );
text = replaceRegex.Replace( text, string.Concat( "!", token.Trim() ) );
}
sw.Stop();
Console.WriteLine( "Complete in {0}ms.", sw.ElapsedMilliseconds );
答案 2 :(得分:1)
你在你的正则表达式中嵌套量词!
([A-Za-z0-9_]+){4,255}
将一个简单的字符串作为'aaaaaaaa':什么是正则表达式引擎应该捕获? 'a'8次,'aa'4次,'aa',然后'a',然后'a',然后......?
这很可能是导致性能问题的原因。就是不要那样做!您尝试在整个文件中匹配的所有内容。即使正则表达式引擎最终会选择最左边,最长的匹配,它总是尝试所有的可能性。
删除+
!