C# 哪种方法比较这些变量更有效?
我正在写一个玩家控制器,我得到了玩家在两个轴(X,Y)上的运动。每个轴上的值大致可以是C# 哪种方法比较这些变量更有效?,c#,performance,comparison,C#,Performance,Comparison,我正在写一个玩家控制器,我得到了玩家在两个轴(X,Y)上的运动。每个轴上的值大致可以是-1,0,1。正值指向上方和右侧。根据我之前的检查,两个值不可能都为零 根据他们的组合,我想确定球员面对的方向。玩家可以选择八个方向。我使用enum:FacingDirection,传递方向 要澄清的示例: 如果X=1和Y=0则播放机正朝屏幕右侧移动 如果X=-1和Y=-1则播放机正朝屏幕左下角移动 我提出了两种可能的解决方案,但我想知道哪一种更有效。 这两种解决方案都使用\u输入,这是一个二维向量,用于获取X
-1,0,1
。正值指向上方和右侧。根据我之前的检查,两个值不可能都为零
根据他们的组合,我想确定球员面对的方向。玩家可以选择八个方向。我使用enum
:FacingDirection
,传递方向
要澄清的示例:如果
X=1
和Y=0
则播放机正朝屏幕右侧移动
如果X=-1
和Y=-1
则播放机正朝屏幕左下角移动
我提出了两种可能的解决方案,但我想知道哪一种更有效。这两种解决方案都使用
\u输入
,这是一个二维向量,用于获取X
和Y
的值
解决方案A
您可以将两个值合并为一个值。例如:
int directions = y * 2 + x;
它唯一地标识一个方向。其允许值为:
-3
<代码>+3,不包括0
然后,您可以在
开关中使用它(解决方案a不带if
s)或用作字典键。解决方案B肯定更快,在最坏的情况下,它会进行4次比较,而解决方案a也会在最坏的情况下,在for循环中进行8次比较
您可以对这两种方法进行基准测试并进行验证。实际测量性能总是一个好主意:这段代码非常简单,但在更复杂的情况下,有些因素并不明显(例如,在处理内存中的许多对象时CPU缓存效果)。这非常聪明。如果使用了float
值,这种方法会起作用吗?@Lae,使用模糊比较值,如果源值也是离散的和有限的,那么是的,它应该起作用。我投票结束这个问题,因为你的问题听起来像是代码改进和/或审查,如果是这样的话,那么可能会偏离主题。它可能更适合其他SE站点,但请务必阅读相关常见问题解答;和/或在交叉发布前根据需要重新措辞您的问题。祝你好运@米基德非常感谢你让我知道。在这种情况下,我是否应该提前删除它?按照指导原则可能是的。此外,如果你在另一个SE网站上提问,你的问题可能会更有价值。祝你好运“解决方案B绝对更快”-你对此有实际的衡量标准还是在猜测?这就是为什么像这样的问题对你不好的原因,它导致了答案中毫无根据的断言。“您可以对这两种方法进行基准测试并验证”-责任实际上在您身上。根据我的统计,B至少有7个比较而不是“4”,因为if
语句每一个都增加了圈复杂度。我陈述了我的度量。我的结论是基于这样的假设:编译器的工作是合理的。如果你想学究的话,编译器在这两种解决方案中的任何一种都可能做得很糟糕,因此如果不使用精确的编译器进行测试,就无法证明哪一种性能更好。但是,实事求是地说,我相信我的回答是明智的。您提到了圈复杂度,但我不知道这会如何影响执行速度。有很多执行路径,但在最坏的情况下,只有4个比较将执行。所以猜测。因为OP的问题不是建设性的主观问题,因此不可避免地会导致人们发布带有不合理结论或未经证实的声明的答案,比如你的。您可以轻松地对其进行基准测试。“我不知道这会如何影响执行速度”-每件事都有代价,甚至是一个比较,布兰奇很抱歉,如果“迂腐”这个词冒犯了你,英语不是我的母语,我不认为它有否定的语气。如果我的回答是错的,你应该能够很容易地反驳它。任何东西都有成本,即使是比较和分支,如果它不运行,也不会有执行成本。不过,我同意你的看法,这个问题不适合堆栈溢出。谢谢,那就不用担心了。:)我听说英语很难学。关于基准测试,提供证据的责任通常由提出索赔的人而不是读者承担。想象一下,如果你是一位科学家,声称他终于发明了冷聚变。虽然公众会非常兴奋,但其他科学家会希望看到你的证据/数据,以便他们能够复制这一说法以及你是如何得出结论的。我们有点像:)我很想通过Jetbrains dotTrace等伟大的工具看到您的程序输出、计时和基准测试
private FacingDirection findMoveDirection() {
float x = _inputs.x, y = _inputs.y;
if (x != 0) {
if (x > 0) {
if (y != 0) {
if (y > 0) {
return FacingDirection.UP_RIGHT;
} else {
return FacingDirection.DOWN_RIGHT;
}
} else {
return FacingDirection.RIGHT;
}
} else {
if (y != 0) {
if (y > 0) {
return FacingDirection.UP_LEFT;
} else {
return FacingDirection.DOWN_LEFT;
}
} else {
return FacingDirection.LEFT;
}
}
} else {
if (y > 0) {
return FacingDirection.UP;
} else {
return FacingDirection.DOWN;
}
}
}
int directions = y * 2 + x;