gpt4 book ai didi

c# - 为什么 OfType<> 比 Cast<> 快?

转载 作者:IT王子 更新时间:2023-10-29 04:16:55 26 4
gpt4 key购买 nike

回答以下问题: How to convert MatchCollection to string array

给定两个 Linq 表达式:

var arr = Regex.Matches(strText, @"\b[A-Za-z-']+\b")
.OfType<Match>() //OfType
.Select(m => m.Groups[0].Value)
.ToArray();

var arr = Regex.Matches(strText, @"\b[A-Za-z-']+\b")
.Cast<Match>() //Cast
.Select(m => m.Groups[0].Value)
.ToArray();

OfType<> 由用户 Alex 进行了基准测试稍微快一点(并由我自己确认)。

这对我来说似乎违反直觉,因为我认为 OfType<> 必须同时进行"is"比较, 转换 (T)。

任何关于为什么会这样的启发将不胜感激:)

最佳答案

我的基准测试与您的基准测试不一致。

我运行了与 Alex 相同的基准测试并得到了相反的结果。然后我稍微调整了基准并再次观察到 CastOfType 快.

内容不多,但我相信 Cast确实有优势,因为它的迭代器更简单。 (没有 is 检查。)

编辑:实际上经过一些进一步的调整我设法得到了 CastOfType 快 50 倍.

<罢工>

以下是迄今为止我发现的最大差异的基准测试代码:

Stopwatch sw1 = new Stopwatch();
Stopwatch sw2 = new Stopwatch();

var ma = Enumerable.Range(1, 100000).Select(i => i.ToString()).ToArray();

var x = ma.OfType<string>().ToArray();
var y = ma.Cast<string>().ToArray();

for (int i = 0; i < 1000; i++)
{
if (i%2 == 0)
{
sw1.Start();
var arr = ma.OfType<string>().ToArray();
sw1.Stop();
sw2.Start();
var arr2 = ma.Cast<string>().ToArray();
sw2.Stop();
}
else
{
sw2.Start();
var arr2 = ma.Cast<string>().ToArray();
sw2.Stop();
sw1.Start();
var arr = ma.OfType<string>().ToArray();
sw1.Stop();
}
}
Console.WriteLine("OfType: " + sw1.ElapsedMilliseconds.ToString());
Console.WriteLine("Cast: " + sw2.ElapsedMilliseconds.ToString());
Console.ReadLine();

我所做的调整:

  • 在开始时执行“生成字符串列表”工作一次,然后“具体化”它。
  • 在开始计时之前执行每个操作之一 - 我不确定这是否有必要,但我认为这意味着 JITter 会事先生成代码,而不是在我们计时时生成代码?
  • 多次执行每个操作,而不是一次。
  • 改变顺序以防产生差异。

在我的机器上这导致 Cast 大约需要 350 毫秒OfType ~18000ms .

我认为最大的不同是我们不再计算多长时间 MatchCollection寻找下一场比赛。 (或者,在我的代码中, int.ToString() 需要多长时间。)这大大降低了信噪比。

编辑:正如 sixlettervariables 所指出的,造成这种巨大差异的原因是 Cast如果可以类型转换整个元素,它会短路并且不会费心类型转换单个元素 IEnumerable .当我从使用 Regex.Matches 切换时到数组以避免测量正则表达式处理时间,我还切换到使用可类型转换的东西 IEnumerable<string>从而激活了这个短路。当我更改基准以禁用此短路时,我比 Cast 获得了轻微 优势。而不是大量

关于c# - 为什么 OfType<> 比 Cast<> 快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11430570/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com