相关疑难解决方法(0)

如何衡量.NET中的代码性能?

我正在使用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显然不够精细.

那么,我怎样才能更好地衡量绩效呢?

.net performance benchmarking

45
推荐指数
6
解决办法
2万
查看次数

Regex.IsMatch vs string.Contains

这两个等效表达式的速度/内存使用有什么不同:

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.所以我想知道改变是否值得.

.net regex string

42
推荐指数
4
解决办法
4万
查看次数

为什么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)

c# oop string language-design contains

13
推荐指数
1
解决办法
423
查看次数

如何从字符串[]中删除无字母字符?

这是代码:

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---------------------------

我只需要得到没有所有标志的单词

所以我试图使用这个循环,但我结束说,有很多地方"" 和一些地方只有------------------------

我不能在我的代码中使用它作为字符串.

c# regex

4
推荐指数
1
解决办法
666
查看次数

标签 统计

.net ×2

c# ×2

regex ×2

string ×2

benchmarking ×1

contains ×1

language-design ×1

oop ×1

performance ×1