gpt4 book ai didi

c# - 循环 : calling a property twice, 和存储属性一次哪个更快?

转载 作者:太空狗 更新时间:2023-10-29 22:04:38 26 4
gpt4 key购买 nike

这更像是一个关于性能的学术问题,而不是一个现实的“我应该使用什么”,但我很好奇,因为我根本没有涉足 IL 来查看构建的内容,而且我没有大型数据集手头上的个人资料。

那么哪个更快:

List<myObject> objs = SomeHowGetList();
List<string> strings = new List<string>();
foreach (MyObject o in objs)
{
if (o.Field == "something")
strings.Add(o.Field);
}

或:

List<myObject> objs = SomeHowGetList();
List<string> strings = new List<string>();
string s;
foreach (MyObject o in objs)
{
s = o.Field;
if (s == "something")
strings.Add(s);
}

请记住,我真的不想知道 string.Add(s) 的性能影响(因为需要完成的任何操作都无法真正改变),只是设置 s 之间的性能差异迭代(假设 s 可以是任何基本类型或字符串)与每次迭代调用对象上的 getter 相比。

最佳答案

在我的测试中,你的第一个选项明显更快。 我真是个笨蛋!不过说真的,在我的原始测试中对代码进行了一些评论。这是显示选项 2 更快的更新代码。

    class Foo
{
public string Bar { get; set; }

public static List<Foo> FooMeUp()
{
var foos = new List<Foo>();

for (int i = 0; i < 10000000; i++)
{
foos.Add(new Foo() { Bar = (i % 2 == 0) ? "something" : i.ToString() });
}

return foos;
}
}

static void Main(string[] args)
{

var foos = Foo.FooMeUp();
var strings = new List<string>();

Stopwatch sw = Stopwatch.StartNew();

foreach (Foo o in foos)
{
if (o.Bar == "something")
{
strings.Add(o.Bar);
}
}

sw.Stop();
Console.WriteLine("It took {0}", sw.ElapsedMilliseconds);

strings.Clear();
sw = Stopwatch.StartNew();

foreach (Foo o in foos)
{
var s = o.Bar;
if (s == "something")
{
strings.Add(s);
}
}

sw.Stop();
Console.WriteLine("It took {0}", sw.ElapsedMilliseconds);
Console.ReadLine();
}

关于c# - 循环 : calling a property twice, 和存储属性一次哪个更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1302887/

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