我有一个每天会被调用数千次的函数,我想优化这个函数,以便它尽可能快速有效。
在此功能中,将检查列表,并根据此检查的结果,将发生不同的操作。我的问题是确定此列表中有多少元素的最有效方法是什么。
显然,你可以像这样检查:
List<Objects> data = GetData();
if (data.Count == 0)
{
//Do something
}
else if (data.Count < 5)
{
//Do something with a small list
}
else
{
//Do something with a larger list
}
这是否是最快/最有效的方法? 我提出了一个替代方案,但我想提出一些建议
List<Objects> data = GetData();
int amountOfObjects = data.Count();
if (amountOfObjects == 0)
{
//Do something
}
else if (amountOfObjects < 5)
{
//Do something with a small list
}
else
{
//Do something with a larger list
}
答案 0 :(得分:2)
您应该使用属性#Powershell command
PS: docker-machine env default
#output might me like this
$Env:DOCKER_TLS_VERIFY = "1"
$Env:DOCKER_HOST = "tcp://172.16.104.171:2376"
$Env:DOCKER_CERT_PATH = "C:\Users\username\.docker\machine\machines\default"
$Env:DOCKER_MACHINE_NAME = "default"
#DOCKER_HOST environmental variable should has same value as default machine
PS:$Env:DOCKER_HOST = "tcp://172.16.104.171:2376" # should be same as default machine Env:DOCKER_HOST
#Now list docker machines, default will be active.
PS: docker-machine ls
#default is not active and it look like this.
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default * hyperv Running tcp://172.16.104.171:2376 v1.12.3
manager1 - hyperv Running tcp://172.16.104.168:2376 v1.12.3
,因为它是预先计算的值,并且在您使用它时不需要重新计算该值,而方法Count
将尝试成为一个自作聪明并尝试要弄清楚是否需要重新计算,但单独解决问题仍然比仅使用Count()
还要努力。
所以,只需使用你最初做过的事情。
答案 1 :(得分:0)
对于List<T>
,Count
属性实际上只返回一个字段,因为该实现是一个数组列表,需要非常准确地知道此集合中有多少元素。因此,您通过尝试缓存此值或任何相似内容而无法获得任何性能。这没问题。
使用其他集合实现时,这种情况可能会有所不同。例如,LinkedList
在概念上不知道其中有多少元素,但必须对它们进行计数,这是一项昂贵的操作。
编辑:使用Count()
的替代方案实际上是一件非常糟糕的事情。由于List<T>
是密封的,编译器将创建一个静态方法调用来访问Count
属性,同时Count()
导致通过接口进行强制转换和虚方法调用。这会花费更多的成本,而JIT编译器可以减少魔法,例如内联。