C# 列表与计数之间的差异>;0和列表。计数!=0
我有一张清单。C# 列表与计数之间的差异>;0和列表。计数!=0,c#,c++,performance,compare,C#,C++,Performance,Compare,我有一张清单。list.Count>0和list.Count!=0?或者这些代码中有任何性能差异 if (list.Count > 0) // do some stuff if (list.Count != 0) // do some stuff 注意:list.Count不能小于ziro 实际上没有什么区别,因为列表中的项目不能少于0个,但是积分比较的==非常快,所以它可能比快。一种看起来更酷的方法是list.Any() (假设列表是指列表类型或任何内置IEnumer
list.Count>0
和list.Count!=0
?或者这些代码中有任何性能差异
if (list.Count > 0)
// do some stuff
if (list.Count != 0)
// do some stuff
注意:list.Count
不能小于ziro
实际上没有什么区别,因为列表中的项目不能少于0个,但是积分比较的
==
非常快,所以它可能比
快。一种看起来更酷的方法是list.Any()
(假设列表是指列表类型或任何内置IEnumerable/集合)
list.Count>0
和list.Count!=0
对。第一个计算list.Count
是否大于0
。第二个参数评估它是否不等于0
。“大于”和“不等于”是两码事
在这个特定的场景中,两种方法之间没有典型的区别
这两个。但是=
和>0
完全不同<代码>>0仅执行
当计数(条件表达式)大于0时,其中为=代码>计数时执行(条件表达式)
大于0
以及小于0
我想如果ICollection.Count是uint
的类型,您就不会有这样的问题了。查看为什么ICollection.Count是int
at
从可读性的角度来看,list.Count!=0
将导致思考计数是否可以为负值。所以我更喜欢个人风格的list.Count>0
。正如大家所解释的,从功能上讲,list.Count!=0
和list.Count>0
作为列表。计数不能小于0
我做了一个快速测试,它显示了!=0
和>0
几乎同样快(这是超快的)。Linq的list.Any()
并没有那么快
下面是测试代码(比较100000次以放大差异)
静态列表GetBigObjectList()
{
var list=新列表();
对于(int i=0;i<10000;i++)
{
添加(新对象());
}
退货清单;
}
静态void Main(字符串[]参数)
{
var myList=GetBigObjectList();
var s1=新秒表();
var s2=新秒表();
var s3=新秒表();
s1.Start();
对于(int i=0;i<100000;i++)
{
var isNotEqual=myList.Count!=0;
}
s1.停止();
s2.Start();
对于(int i=0;i<100000;i++)
{
var isGreaterThan=myList.Count>0;
}
s2.停止();
s3.Start();
对于(int i=0;i<100000;i++)
{
var isAny=myList.Any();
}
s3.停止();
Console.WriteLine(“所用时间!=:”+s1.elapsedmillyses);
Console.WriteLine(“所用时间>:”+s2.ElapsedMilliseconds);
WriteLine(“Any():”+s3.elapsedmillyses所用的时间);
Console.ReadLine();
}
它表明:
所用时间!=:0
>:0所用时间
任何()所用的时间:10
我猜在CPU寄存器级别,用于比较两个数字的汇编命令将逐位检查这些数字,并将激活一些条件标志以跳转到指定行。例如:
cmp BL, BH ; BL and BH are cpu registers
je EQUAL_Label ; BL = BH
jg GREATER_Label ; BL > BH
jmp LESS_Label ; BL < BH
cmp-BL,BH;BL和BH是cpu寄存器
je-EQUAL_标签;BL=BH
jg大齌标签;BL>BH
jmp-LESS_标签;BL
正如您所看到的,je
、jg
或jmp
命令几乎是在以前的cmp
(比较)命令上工作的最基本的命令。
总之,我们可以说这些比较命令之间没有显著的性能差异。
祝你好运如果这会让你的程序成功或失败,那么你的状态很好。你为什么关心它,关于性能或正确性?@qxg,我只是好奇,在程序员的世界里,一个更好、更标准……没有区别。我会说,甚至没有一个周期的差异。还有一类类似的问题,我们能假设它们是指一个不少于0的列表吗?@TimothyStepanski你应该问OP。我没有这样的假设。列表的计数从来都不少于0,所以在这里它们是一样的。你怎么知道?如果你有权访问OP的代码,你能告诉我们它是用什么语言写的,以及list
是什么吗。列表。计数将不会为负。我在第二次发言中想说的是>0
和之间的区别=
I虽然在相同的行中(向上投票),但实际上list.Any()
似乎更慢!在下面检查我的答案:)
static List<object> GetBigObjectList()
{
var list = new List<object>();
for (int i = 0; i < 10000; i++)
{
list.Add(new object());
}
return list;
}
static void Main(string[] args)
{
var myList = GetBigObjectList();
var s1 = new Stopwatch();
var s2 = new Stopwatch();
var s3 = new Stopwatch();
s1.Start();
for (int i = 0; i < 100000; i++)
{
var isNotEqual = myList.Count != 0;
}
s1.Stop();
s2.Start();
for (int i = 0; i < 100000; i++)
{
var isGreaterThan = myList.Count > 0;
}
s2.Stop();
s3.Start();
for (int i = 0; i < 100000; i++)
{
var isAny = myList.Any();
}
s3.Stop();
Console.WriteLine("Time taken by != : " + s1.ElapsedMilliseconds);
Console.WriteLine("Time taken by > : " + s2.ElapsedMilliseconds);
Console.WriteLine("Time taken by Any() : " + s3.ElapsedMilliseconds);
Console.ReadLine();
}
cmp BL, BH ; BL and BH are cpu registers
je EQUAL_Label ; BL = BH
jg GREATER_Label ; BL > BH
jmp LESS_Label ; BL < BH