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

28
我有一个包含大量生成的JavaScript代码的Web应用程序。在桌面Chrome上运行Web应用程序与在(更新的)iPad上的UIWebView中运行Web应用程序相比,内存消耗相差6倍。
为了使iOS上的内存消耗与Chrome相当,应避免哪些构造或模式?
生成的JavaScript的特征:
- 代码由Haxe生成。 - 代码是“面向对象”的,它大量使用prototype,但以文明的方式实现。 - 代码在JavaScript对象上大量使用命名索引来实现哈希表。 - 有很多字符串,但几乎没有字符串连接。
似乎没有任何内存泄漏;在构建(固定集合的)Javascript对象时立即显示iOS上的过度内存消耗。

1
请注意,UIWebView使用较旧版本的JavaScript引擎,在iOS上执行JS比Safari慢。如果您在Safari中运行代码,它是否运行得足够快? - Mark Knol
1
Web应用程序应该在Safari中运行,我只使用UIWebView来允许XCode查看内存消耗,这就是问题所在(即Safari会不时重新加载页面)。执行速度并不是真正的问题。 - jpsecher
2
移动版Safari使用WKWebView,因此您的应用程序应该实例化其中一个来进行比较。您还可以添加v8javascriptcore标签,以便这两个JS引擎的专家可以参与讨论。 - Ed Ballot
你尝试在专用的 Github 上开启问题了吗?https://github.com/HaxeFoundation/haxe/issues - lifeisfoo
1
我认为没有任何模式可以应用于解决有缺陷的实现。它可能只需要比V8更多的内存。 - Bergi
显示剩余2条评论
4个回答

2

由于您的代码在桌面上运行良好,因此可能是iOS中的某些基础怪癖。我不认为您可以通过更多面向对象的编程方式来修复它。当然,这可能会稍微减少内存占用,但不会减少6倍。

UIWebView因创建内存泄漏而著名,您可以尝试使用更新的(iOS 8+)WKWebView,其垃圾回收要好得多

Apple WKWebView Reference


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

虚拟滚动对于保持DOM尽可能小而言非常有用,virtual-scroll


-1

你可以尝试通过GWT来优化你的代码(我相信它的编译器比haxe的js编译器更加优化)。

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

如果将其转换为java,再转换为GWT太困难了,一个接近的方法是使用Google闭包编译器对由haxe生成的JavaScript进行处理。我不确定haxe是否能够以与ADVANCED_OPTIMIZATION模式(https://developers.google.com/closure/compiler/docs/compilation_levels#advanced_optimizations)兼容的方式输出JavaScript,这是你需要做的(否则,闭包就不比简单的代码最小化器好多少)。


-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.Bar 共享来节省 baz.Bar2 分配的内存。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接