我有一个包含大量生成的JavaScript的网络应用。与在(更新的)iPad上的UIWebView
中运行网络应用程序相比,在桌面上运行Chrome应用程序之间的内存消耗相差6倍。
我应该避免哪些构造或模式使iOS上的内存消耗与Chrome的内存消耗相同?
生成的JavaScript的特征:
prototype
,但在civilized way。似乎没有任何内存泄漏;在构建(固定的)Javascript对象时,iOS上的内存消耗过多。
答案 0 :(得分:2)
由于您的代码在桌面上运行良好,因此可能是iOS中的一些基本怪癖。我怀疑你可以使用更面向对象的编程方式来修复。当然这可能会减少内存占用,但不会减少6倍。
UIWebView因创建内存泄漏而臭名昭着,您可以尝试使用较新的(iOS 8+)WKWebView具有多更好的垃圾回收。
答案 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共享。