【问题标题】:Javascript efficiency: big object vs many arraysJavascript 效率:大对象与许多数组
【发布时间】:2016-03-31 09:17:34
【问题描述】:

我正在开发一个基于 Web 的小游戏(websockets 和 nodejs),我只是好奇哪种方法会被认为是更好的实践/更有效的方法。

我有一堆可以连接到游戏服务器的客户端。每个客户端都有一堆不同的属性需要保存..

  • 位置:x、y、方向、速度等
  • 属性:能量、生命值、伤害等
  • websocket 连接信息
  • 控件:按键等
  • 其他几件事

目前我已将这些区域划分为单独的数组,因此如果我需要获取用户 12 的位置,我会查看 usrPos[12].x 以及是否需要将信息发送到客户端通过 websocket 我查看 usrSoc[12].id 等等。

我最近一直在想是否应该将所有信息合并到一个数组中。所以我查看 usr[12].pos.xusr[12].soc.id。显然,这会创建一个更大的对象数组,但在一定程度上提高了可读性。此外,我不需要跟踪 10 个不同的数组来为一个用户存储数据。

那么哪种方式更好呢?一种方法比另一种更有效吗?有兴趣听听人们的想法。谢谢!

【问题讨论】:

  • 这对于Stack Overflow来说太宽泛了
  • 实际上它只创建更多个对象,而不是更大个对象。尽管they might have different access characteristics,理论上这两种方法都应该占用相同数量的空间。实际上,这根本不重要。如果它对您来说足够重要,那么您应该根据您的真实数据对解决方案进行基准测试。
  • 几乎可以肯定的是,不将逻辑连接的数据拆分为不同的数据结构在概念上更容易且不易出错。例如。想想如果在两种情况下都需要删除其中一个用户,您需要做什么;或者是否需要对用户进行排序;或者,如果在你实现了这些东西之后,需要添加一个新属性。

标签: javascript arrays node.js performance websocket


【解决方案1】:

哪种方式更好?好吧,我们在这里讨论的是基本的 OOP:您有许多不同的“数组”,其中包含有关客户端的信息,而客户端的信息分散在许多不同的数组中,每个数组必须与另外 10 个数组共享索引。

你有一个问题:当你从 sockets 数组中删除一个套接字,但不删除位置时会发生什么?错误!

因此,如果客户端是客户端,请将其视为一个整体,具有 10 个(在您的示例中)复合属性,关于客户端的套接字、他的属性等。

请不要考虑“效率”。您的问题的答案不是关于效率,而是关于可维护性、健壮性和简单性。这通常会促使您自然而然地获得更好的性能,但只有当您遇到性能问题时,您才应该关心性能。

记住(写在墙上):Premature optimization is the root of all evil

【讨论】:

  • 我不认为这与“OOP”有任何关系(或至少很少有关系)。
  • 对不起,我没有关注你。设计系统中的“类”时要做的第一件事是决定涉及哪些类型的对象以及它们是关于什么的。正如我所说,基本的 OOP。如果有一个客户端“东西”,那么可能应该有一个客户端类,或者至少应该有一个具有客户端属性的对象,如果他不打算实现一个适当的类的话。并不是说 JavaScript 中有这样的东西,但我希望你明白这一点。
  • 没什么大不了的,但通常 OOP 用于指代封装数据和功能的类和类层次结构的设计。这更像是一个简单的旧数据结构设计问题。
  • 所以基本上你是说最好只担心简单性。因为即使有任何性能提升,它也可能是一个很小的差异,它永远不会影响任何东西。也不能证明额外的努力是合理的。
  • 差不多。我是说只有当性能成为一个问题时,它才会成为一个问题。首先计划可维护性(或可测试性,实际上是相同的)并使软件工作。然后,测量。如果度量不满足,只有到那时,您才能开始优化。只有 10% 才是真正的瓶颈:很可能性能消耗不在您预期的位置,因此请先进行测量,然后再进行重构。
猜你喜欢
  • 2013-06-22
  • 2014-12-18
  • 2018-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多