Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 空指针测试性能_C#_Performance_C# 4.0_Null Pointer - Fatal编程技术网

C# 空指针测试性能

C# 空指针测试性能,c#,performance,c#-4.0,null-pointer,C#,Performance,C# 4.0,Null Pointer,测试C#中的引用类型变量是否为空指针(如if(x==null)..)与测试小于零的整数甚至布尔值为假相比,性能如何 是否知道与此类空指针测试相关的其他问题,例如garbadge是否生产 我对一个游戏的每一帧都进行了数百次这样的测试,我想知道这些测试是否会导致问题,或者是否可以更有效地实现?如果(x==null)空性测试可能等同于简单的“等于0”测试,则没有问题(性能或其他方面)。它们非常非常便宜——每帧只有数百帧应该是完全不重要的,除非你有数百万的帧速率:) 你应该分析一下你的应用程序,找出时间

测试C#中的引用类型变量是否为空指针(如
if(x==null)
..)与测试小于零的整数甚至布尔值为假相比,性能如何

是否知道与此类空指针测试相关的其他问题,例如garbadge是否生产


我对一个游戏的每一帧都进行了数百次这样的测试,我想知道这些测试是否会导致问题,或者是否可以更有效地实现?

如果(x==null)空性测试可能等同于简单的“等于0”测试,则
没有问题(性能或其他方面)。它们非常非常便宜——每帧只有数百帧应该是完全不重要的,除非你有数百万的帧速率:)


你应该分析一下你的应用程序,找出时间实际花在哪里——这比猜测更有效率。理想情况下,您还应该尝试编写一些基准测试,这样您不仅可以测量当前的性能,还可以注意到它是否由于任何特定的更改而变得更糟。

但是,像您这样进行密集检查可能会导致性能下降,这只能通过你自己的标准来衡量你的特定应用程序


根据测试的重点,当你检查时,可能还有其他方法可以让你更聪明。然而,如果不了解更多关于您的应用程序的信息,就很难想出一个答案。

这绝对不是问题-您提到的所有测试通常只需要一个时钟周期。如果条件分支对性能有影响,通常是由于不可预测或至少难以预测的分支行为污染了分支预测器,并要求终止推测执行的分支。

测试null值不是一个需要类型检查或类似操作的复杂操作,而且不涉及内存分配

如果(x==null)
分解语句,则给出:

00000030  cmp         qword ptr [rsp+20h],0
00000036  jne         000000000000004A

也就是说,测试是作为指针值的简单整数比较来实现的。

可能是主观的-但是空检查相当于等于零检查,并且同样快速。所以我认为你不应该担心这个

同样-除非你有性能问题,否则为什么还要玩它呢

同样,如果您确实存在性能问题,那么您很可能能够从复杂的代码分支获得性能,而不是消除一些空检查

也就是说,对于条件代码来说,一个潜在的性能改进(然而,这将严重需要进行基准测试)可能是对由于一个或多个条件更改而设置的不同逻辑分支使用委托-但如果这样的解决方案在一般情况下确实提高了性能,我会感到惊讶-尤其是对于“is null”场景。所以,我的意思是这样的:

if([condition])
{
  Foo();
}
else
{
  Bar();
}
如果,比如说,
[condition]
涉及一个局部变量
\u obj
(在您的情况下,
\u obj==null
)-您可以用类似的东西替换(但要非常小心线程问题):

现在,在以前选中
[condition]
进行分支的任何代码中,只需执行以下操作:

_logic();
[condition]
非常复杂时,这种情况得到了最大的改进,而且最关键的是,通过分析已被证明占用了大量处理器时间。使用委托也会在条件分支上带来轻微的开销,但如果该开销小于执行
[condition]
的开销,则会产生不同,尤其是在频繁执行这些检查的情况下

还有其他一些变体,最常见的是从值派生的函数查找表,而不是基于相等性检查选择代码分支(这就是可以实现大型switch/case语句的方式-将委托添加到由要检查的枚举/值键入的
字典中-这避免了对值的多次检查)


但最终,如果没有对评测的尽职调查(当然是在评测之前和之后),执行此类优化从根本上来说毫无意义。

您应该尝试一下,只需编写一些性能测试“过早优化是万恶之源”“如果我再一次听到这个引用……”VeNeto OP已经声明他正在C语言中做游戏。因此,在每次GC运行时不必创建每个帧的垃圾。因此,你可以认为这不是过早的优化,因为这可以直接改变设计决策。@ PADYARES:1。让它运行。2。运行它。3。。让它运行得快。按顺序:)我想很多人说以后要优化,但他们从来没有用托管语言设计过游戏。我在这里看不到强化检查的证据。@JonSkeet“我对游戏的每一帧都做了上百次这样的测试”-我想说的是,根据每秒有多少帧划分为密集型。我不同意。你知道大多数游戏每帧可能要做多少工作吗?100个非常便宜的测试根本不可能有意义,除非你期望帧速率达到几十万。假设是200fps。这就是每秒20000次空值检查。即使是在一台非常低功耗的计算机上,这也不会有什么意义。@JonSkeet每秒20000次空值检查(对于一个应用程序的一小部分)在我看来是密集的-你的明显不同。然而,我不写游戏应用程序,这就是为什么我说“这只能通过你自己的标准来衡量你的特定应用程序”。我的观点是——可能有更聪明的方法来做事情。跟踪性能,而不仅仅是不时地测量性能,这一点很好。如果这一分支总是错误或正确的,那么它对性能的影响将大大降低
_logic();