我正在使用DateTime对一行C#代码进行一些真正的快速和脏的基准测试:
long lStart = DateTime.Now.Ticks;
// do something
long lFinish = DateTime.Now.Ticks;
Run Code Online (Sandbox Code Playgroud)
问题在于结果:
Start Time [633679466564559902] Finish Time [633679466564559902] Start Time [633679466564569917] Finish Time [633679466564569917] Start Time [633679466564579932] Finish Time [633679466564579932]
...等等.
鉴于开始和结束时间相同,Ticks显然不够精细.
那么,我怎样才能更好地衡量绩效呢?
这两个等效表达式的速度/内存使用有什么不同:
Regex.IsMatch(Message, "1000")
Run Code Online (Sandbox Code Playgroud)
VS
Message.Contains("1000")
Run Code Online (Sandbox Code Playgroud)
任何一个比其他更好的情况?
这个问题的上下文如下:我正在对包含Regex表达式的遗留代码进行一些更改,以查找字符串是否包含在另一个字符串中.作为遗留代码,我没有对此进行任何更改,在代码审查中有人建议Regex.IsMatch应该替换为string.Contains.所以我想知道改变是否值得.
该String.Contains方法内部应该是这样
public bool Contains(string value)
{
return this.IndexOf(value, StringComparison.Ordinal) >= 0;
}
Run Code Online (Sandbox Code Playgroud)
IndexOf调用的重载看起来像这样
public int IndexOf(string value, StringComparison comparisonType)
{
return this.IndexOf(value, 0, this.Length, comparisonType);
}
Run Code Online (Sandbox Code Playgroud)
这里再次调用最终重载,然后CompareInfo.IndexOf使用签名调用相关方法
public int IndexOf(string value, int startIndex, int count, StringComparison comparisonType)
Run Code Online (Sandbox Code Playgroud)
因此,调用最终的重载将是最快的(尽管在大多数情况下可以被认为是微优化).
我可能会遗漏一些明显的东西,但为什么该Contains方法不会直接调用最终的重载,因为在中间调用中没有进行其他工作,并且在两个阶段都可以获得相同的信息?
唯一的好处是,如果最终过载的签名发生变化,只需要进行一次更改(中间方法的更改),或者设计是否还有更多?
从评论中编辑(有关速度差异说明,请参阅更新2)
为了澄清的性能差异我得到的情况下,我犯了一个错误的地方:我跑这个基准测试(循环5次,以避免抖动偏差),并使用该扩展方法来比较的String.Contains方法
public static bool QuickContains(this string input, string value)
{
return input.IndexOf(value, 0, input.Length, StringComparison.OrdinalIgnoreCase) >= 0;
}
Run Code Online (Sandbox Code Playgroud)
循环看起来像这样
for (int i = 0; i < 1000000; i++) …Run Code Online (Sandbox Code Playgroud) 这是代码:
StringBuilder sb = new StringBuilder();
Regex rgx = new Regex("[^a-zA-Z0-9 -]");
var words = Regex.Split(textBox1.Text, @"(?=(?<=[^\s])\s+\w)");
for (int i = 0; i < words.Length; i++)
{
words[i] = rgx.Replace(words[i], "");
}
Run Code Online (Sandbox Code Playgroud)
当我正在做的Regex.Split()话包含内部字符串的字符串exmaple:
Daniel>
要么
Hello:
要么
\r\nNew
要么
hello---------------------------
我只需要得到没有所有标志的单词
所以我试图使用这个循环,但我结束说,有很多地方""
和一些地方只有------------------------
我不能在我的代码中使用它作为字符串.