gpt4 book ai didi

c# - 高度频繁地创建类的短期新实例是否效率低下?

转载 作者:行者123 更新时间:2023-11-30 18:28:13 25 4
gpt4 key购买 nike

我有一个 C# 程序可以跟踪玩家在游戏中的位置。在这个程序中,我有一个名为 Waypoint (X, Y, Z) 的类,它表示游戏 map 上的一个位置。在我产生的其中一个线程中,我不断检查玩家与某个目标 Waypoint 的距离,在 while(true) 循环中一个接一个地快速检查。在 Waypoint 类中有一个名为 public double Distance(Waypoint wp) 的方法,它计算从当前路点到作为参数传递的路点的距离。

问题:每次我想检查玩家到目标航点的距离时,是否可以为玩家的位置创建一个新的航点?然后程序可能会在 while(true) 循环中一遍又一遍地创建这个播放器 Waypoint,只是为了计算距离。

PS:我的程序可能需要巧妙地使用资源,因为它正在运行多个线程和连续的 while 循环来完成各种工作,例如将玩家的 X、Y、Z 位置发布到 UI。

非常感谢!

最佳答案

其他答案的意思是:
- 也许您应该创建堆栈本地实例,因为它不应该花费太多,并且
- 也许您不应该这样做,因为内存分配的成本很高。
这些是猜测 - 有根据的猜测 - 但仍然是猜测。

您是唯一可以回答这个问题的人,通过实际发现(而不是猜测)这些新闻是否占用了足够大的挂钟时间百分比值得担心。

我(和许多其他人)用来回答这类问题的方法是 random pausing .

这个想法很简单。假设这些消息,如果以某种方式消除,将节省——选择一个百分比,比如 20%——的时间。这意味着,如果您只是简单地按下暂停按钮并显示调用堆栈,您至少有 20% 的机会实时捕捉到它。因此,如果你这样做 20 次,你会看到它大约做了 4 次,或多或少。

如果你这样做,你会看到什么占了时间。
- 如果是新闻,你会看到的。
- 如果是别的东西,你会看到的。
你不会确切知道它的成本是多少,但你不需要知道。
您需要知道的是问题所在,而这正是它告诉您的内容。


已添加:如果您愿意解释这种性能调整如何进行,下面是一个假设情况的说明:
enter image description here
当你对堆栈进行采样时,你可能会发现许多可以改进的地方,其中之一可能是内存分配,甚至可能不会很大,因为在这种情况下它是 (C) 只占 14% .它告诉您其他事情花费了更多时间,即 (A)。

因此,如果您修复 (A),您将获得 1.67 倍的加速因子。不错。

现在,如果您重复该过程,它会告诉您 (B) 会为您节省很多时间。因此,您修复它并(在本示例中)获得另一个 1.67 倍,整体加速为 2.78 倍。

现在你再做一次,你会发现原来你怀疑的事情,内存分配,确实占了很大一部分时间。所以你修复它并(在这个例子中)得到另一个 1.67 倍,整体加速为 4.63 倍。现在这是严重的加速。

所以重点是 1) 对要加速的内容保持开放的心态 - 让诊断告诉您要修复的内容,以及 2) 重复该过程以进行多次加速。这就是您获得真正加速的方式,因为当您修剪掉其他内容时,开始时很小的内容会变得更加重要。

关于c# - 高度频繁地创建类的短期新实例是否效率低下?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25429291/

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