【问题标题】:JS Strings/Numbers and Garbage CollectionJS 字符串/数字和垃圾回收
【发布时间】:2013-02-17 05:10:33
【问题描述】:

tl;博士

以下代码行是否创建了一个对象(如 JavaScript String 对象或 JavaScript Number 对象)来组合字符串原语和数字?

var scouterSays = "powerlvl" + 9001;

完整问题

我正在用 JavaScript 编写一个游戏引擎,并试图非常小心地收集垃圾。我已经阅读了http://www.scirra.com/blog/76/how-to-write-low-garbage-real-time-javascripthttp://buildnewgames.com/garbage-collector-friendly-code/,它们非常有帮助。我已经实现了对象池,并尽可能避免使用链表来进行数组操作。

现在,如果我理解正确,如果我在原始字符串上调用字符串方法,则会创建一个字符串对象并替换我的原始字符串。示例是长度、子字符串、indexOf 等。由于我使用字符串来识别具有对象池的对象类型,因此我担心每次从池中拉出对象时都会产生垃圾。

简而言之,以下是否会导致对象(如 JavaScript String 对象或 JavaScript Number 对象)被创建?

var byteSize = 4;
var objectType = "msg" + byteSize; //does this create a JS String/Number object?
var message = gameengine.pool.acquire(objectType);

另外,一个相关的问题是,使用按位运算(如 ~~() 或 >)也会导致创建 JavaScript 对象吗?

【问题讨论】:

  • 为什么要避免使用数组来支持链表?后者需要至少尽可能多的对象,可能更多,并且缓存友好的内存布局较少。真正需要从序列中间移除对象的情况相当罕见——许多游戏主要使用数组就可以了。另外,您是否考虑过类型化数组与面向数据的设计相结合?
  • 我需要经常从列表中删除对象,以至于我认为在很多情况下都需要链表。现在回想起来,我可以在一些我不会修改数据结构的地方使用数组。我不知道类型数组与面向数据的设计相结合。你能提供一个描述它的链接吗?谢谢!
  • 由于从容器中删除引用不会使其他引用无效,您也可以轻松有效地从数组中删除,如果您不需要任何特定顺序 (将要删除的元素与最后一个元素交换,然后将数组缩小 1,这基本上是免费的)。 RE 面向数据的设计:gamesfromwithin.com/category/data-oriented-design 和一些altdevblogaday.com/author/niklas-frykholm 教会了我。我提到类型化数组是因为 AFAIK 比常规数字的常规数组更有可能实际获得一些承诺的性能优势。
  • 我一直在阅读有关该主题的大量内容,到目前为止,我的结论是,我已经过头了,不应该担心通过面向数据的设计来优化速度.相反,我学到的是我构建的实体组件模型是不够的,我应该首先学习/实现一个实体系统,这反过来又导致了面向数据的设计,因为它将数据与逻辑分开。试图让我的头脑围绕着一个包含多个数据数组的 Balls 对象而不是一个 Ball 对象现在对我来说太多了。小步骤。感谢您的提示!
  • 我出售实体系统主要是为了组织目的,而不是潜在的绩效提升。尽管如此,对于面向数据的设计和类型化数组,我现在很好奇当我将类型化数组中的整数加载到变量中时会发生什么,比如 var x = int32View[0],然后对其进行数学运算,比如 x + = 5. 它是否被强制转换为双倍,以便我可以对其进行数学计算?如果是这样,使用类型化数组而不是数字会有任何性能优势吗?

标签: javascript string garbage-collection


【解决方案1】:

我对 JavaScript GC 的信任度为零,这是我远离这种语言的基本原因。无论如何,我的回复是:

var x = 1;
alert(typeof x); //number

var n = new Number(1);
alert(typeof n); //object

var scouterSays = "powerlvl" + 9001;
alert(typeof scouterSays); //string

var txt = new String("string");
alert(typeof txt); //object

var test1 = new Boolean(true);
var test2 = String(test1); //convert object to string
alert(typeof test2); //string

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 2013-10-30
    • 1970-01-01
    相关资源
    最近更新 更多