频繁创建类的短期新实例是否效率低下?

2024-04-14

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

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

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

多谢!


其他答案说的是:
- 可能是你should创建堆栈本地实例,因为它不会花费太多,并且
- 可能是你不应该这样做是因为内存分配的成本可能很高。
这些都是猜测——有根据的猜测——但仍然是猜测。

你是唯一能够回答这个问题的人,通过实际找出(而不是猜测)这些新闻是否占用了足够大的挂钟时间来值得担心。

我(和许多其他人)用来回答此类问题的方法是随机暂停 https://stackoverflow.com/a/378024/23771.

这个想法很简单。 假设这些新闻,如果以某种方式消除,将节省(选择百分之一,比如 20%)的时间。 这意味着,如果您只需按下暂停按钮并显示调用堆栈,您至少有 20% 的机会抓住它。 因此,如果你这样做 20 次,你会看到它大约做了 4 次,无论是给予还是接受。

如果你这样做,你就会看到时间的占用情况。
- 如果是新闻,你就会看到。
- 如果是别的东西,你会看到的。
您不会确切知道它的费用是多少,但您也不需要知道这一点。
您需要知道问题是什么,这就是它告诉您的内容。


ADDED: If you'll bear with me to explain how this kind of performance tuning can go, here's an illustration of a hypothetical situation:
enter image description here
When you take stack samples, you may find a number of things that could be improved, of which one of them could be memory allocation, and it might not even be very big, as in this case it is (C) taking only 14%. It tells you something else is taking a lot more time, namely (A).

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

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

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

因此,重点是 1) 对要加速的内容保持开放的态度 - 让诊断告诉您要修复什么,2) 重复该过程,以实现多次加速。这就是您获得真正加速的方式,因为当您削减其他内容时,一开始很小的事情就会变得更加重要。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

频繁创建类的短期新实例是否效率低下? 的相关文章

随机推荐