在iOS Safari上避免使用JavaScript构造/模式?

时间:2015-08-19 14:23:53

标签: javascript ios v8 haxe javascriptcore

我有一个包含大量生成的JavaScript的网络应用。与在(更新的)iPad上的UIWebView中运行网络应用程序相比,在桌面上运行Chrome应用程序之间的内存消耗相差6倍。

我应该避免哪些构造或模式使iOS上的内存消耗与Chrome的内存消耗相同?

生成的JavaScript的特征:

  • 代码由Haxe生成。
  • 代码是"面向对象"因为它大量使用prototype,但在civilized way
  • 代码大量使用JavaScript对象上的命名索引来实现哈希表。
  • 有很多字符串,但几乎没有任何字符串连接。

似乎没有任何内存泄漏;在构建(固定的)Javascript对象时,iOS上的内存消耗过多。

4 个答案:

答案 0 :(得分:2)

由于您的代码在桌面上运行良好,因此可能是iOS中的一些基本怪癖。我怀疑你可以使用更面向对象的编程方式来修复。当然这可能会减少内存占用,但不会减少6倍。

UIWebView因创建内存泄漏而臭名昭着,您可以尝试使用较新的(iOS 8+)WKWebView具有更好的垃圾回收。

Apple WKWebView Reference

答案 1 :(得分:1)

我的建议是,您要查看应用程序的DOM部分。 我不认为可以在JavaScript结构中进行很多优化。 移动设备/平板电脑中的薄弱环节通常是渲染过程。 如果您的目标是减少内存消耗,则可以更改DOM的工作方式。 尽量保持最小的DOM节点,隐藏隐藏的DOM节点的内容(节点内容)。 这种DOM操作,帮助我在过去使我的Web应用程序更具响应性,并尽可能降低内存使用率。

虚拟滚动,对于保持dom尽可能小,virtual-scroll

非常有用

答案 2 :(得分:-1)

您可以尝试优化代码的一种潜在方式是通过GWT(我相信,其编译器是比haxe的js编译器更优化的编译器)。

我首先将所有haxe代码编译成java,然后通过GWT将其转换为js,并查看内存需求是否保持同样高的值。

如果转换为java,那么对GWT来说太难了,近似的是在通过haxe生成的结果javascript上使用google closure编译器。我不敢肯定,如果haXe的是能够以一种与ADVANCED_OPTIMIZATION模式兼容输出的JavaScript(https://developers.google.com/closure/compiler/docs/compilation_levels#advanced_optimizations),这是你&#39是什么; D需要做的(否则,关闭只不过是一个简单的更好代码最小化器。)

答案 3 :(得分:-2)

你提到它大量使用原型。 这可能是一个原因:如果您认为您的对象可以共享相同的原型,请尝试这样做;例如:

baz.Bar = function () {
    // constructor
};

baz.Bar.prototype = {
    fooProp: ["bar", "foo"],
    foo : function (){
        //method
    }
};

baz.Bar2.prototype = baz.Bar.prototype;

您会注意到baz.Bar2.prototype指向baz.Bar.prototype。 使用此概念,您可以保存由baz.Bar2分配的内存,因为它与baz.Bar共享。