- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我试图在呈现多行(列最少 25 倍)的表格时优化页面加载速度。
我没有在 Angular 应用程序上调试/改进性能的经验,所以我完全不知道这种速度不足可能涉及什么。
这是 5 行查询的 Chrome 时间线报告:
这是 100 行查询的 Chrome 时间线报告:
XHR 负载(api/list/json/Chemical...)随着在表上呈现更多行而增加。
带有数据的服务器响应快速返回(不是瓶颈):
这是表格的模板:
<tbody ng-if="compressed">
<tr ng-if="dbos && (rows.length == 0)">
<td class="tableColumnsDocs"><div class="tableButtons"> </div></td>
<td class="tableColumnsDocs"><div>No results</div></td>
<td class="tableColumnsDocs" ng-repeat="attobj in columns track by $index" ng-if="$index > 0">
<p> </p>
</td>
</tr>
<tr class="tableRowsDocs" ng-repeat="dbo in rows track by $index">
<td class="tableColumnsDocs"><div ng-include="'link_as_eye_template'"></div></td>
<td class="tableColumnsDocs" ng-repeat="attobj in columns track by $index">
<div ng-init="values = dbo.get4(attobj.key); key = attobj.key; template = attobj.template || getAttributeTemplate(dbo.clazz + attobj.key);">
<div class="content" ng-include="template"></div>
<div class="contentFiller" ng-include="template"></div>
</div>
</td>
</tr>
</tbody>
这里是表格将调用的模板:
<script type="text/ng-template" id="plain_values_template">
<p ng-repeat="v in values track by $index">{{ v }}</p>
</script>
<script type="text/ng-template" id="links_as_dns_template">
<div ng-repeat="dbo in values track by $index" ng-include="'link_as_dn_template'"></div>
</script>
<script type="text/ng-template" id="json_doc_template">
<textarea class="form-control" rows="{{values.length + 2}}" ng-trim="false" ng-readonly="true">{{ values | json }}</textarea>
</script>
<script type="text/ng-template" id="link_as_dn_template">
<a href="#/view/{{ dbo.cid }}"><p>{{ dbo.displayName() }}</p></a>
相关 Controller 部分:
$scope.getAttributeTemplate = function(str) {
//console.log("getAttributeTemplate"); console.log(str);
if ($templateCache.get(str + ".template")) {
return str + ".template";
}
var a = str.split(/(>|<)/);
//console.log(a);
if ((a.length - 1) % 4 == 0) {
return "links_as_dns_template";
}
var clsname = a[a.length - 3];
if (clsname == "*") {
return "plain_values_template";
}
var attname = a[a.length - 1];
var cls = datamodel.classes[clsname];
var att = cls.attribute[attname];
if (!att) {
return "plain_values_template";
}
if (att.type == "ref") {
return "links_as_dns_template";
}
return "plain_values_template";
};
我不熟悉 Angular 和性能选项。因此,任何有关如何改进的提示或突出显示的不良做法都会非常有帮助!
最佳答案
长表是 Angular 最大的弊端,因为 ng-repeat 等极慢的基本指令
一些简单明了的东西:
我在行/单元格模板中看到很多没有一次性绑定(bind)的绑定(bind) (::)。我认为您的行数据没有发生变化。切换到一次性绑定(bind)将减少观察者数量 -> 性能。
一些更难的东西:
快速回答:
不要让 Angular 处理性能瓶颈
长答案:
ng-repeat 应该编译它的嵌入内容一次。但是使用 ng-include 会扼杀这种效果,导致每一行都对其 ng-include 内容调用编译。在大表中获得良好性能的关键是能够生成(是的,手动,$compile,$interpolate 和东西)一个独特的编译行链接函数,尽可能少的 Angular Directive(指令) - 理想情况下只有一次性表达式绑定(bind),并手动处理行成瘾/删除(没有 ng-repeat,你自己的指令,你自己的逻辑)
您至少应该找到一种方法来避免在'ng-repeat="attobj in columns track by $index"' 上出现第二次嵌套的 ng-repeat。这是对每一行的双重重复,杀死编译和链接(渲染性能)和观察者计数(生命周期性能)
编辑:正如所要求的,一个“天真的”例子说明了如何尽可能手动(和快速)地处理表格渲染。请注意,该示例不处理表头的生成,但这通常不是最难的事情。
function myCustomRowCompiler(columns) {
var getCellTemplate = function(attribute) {
// this is tricky as i dont know what your "getAttributeTemplate" method does, but it should be able to return
// the cell template AS HTML -> you maybe would need to load them before, as getting them from your server is async.
// but for example, the naive example to display given attribute would be
return $('<span>').text("{{::model."+ attribute +"}}"); // this is NOT interpolated yet
};
var myRowTemplate = $('<tr class="tableRowsDocs">');
// we construct, column per column, the cells of the template row
_.each(columns, function(colAttribute, cellIdx) {
var cell = $("<td>");
cell.html(getCellTemplate());
cell.appendTo(myRowTemplate);
})
return $compile(myRowTemplate); // this returns the linking function
}
和天真的用法:
function renderTableRows(dbos, columns) {
var $scope; // this would be the scope of your TABLE directive
var tableElement = $el; // this would be your table CONTENT
var rowLinker = myCustomRowCompiler(columns); // note : in real life, you would compile this ONCE, but every time you add rows.
for(var i=0; i<dbos; i++) {
var rowScope = $scope.$new(); // creating a scope for each row
rowScope.model = dbos[0]; // injecting the data model to the row scope
rowLinker(rowScope, function(rowClone) { // note : you HAVE to use the linking function second parameter, else it will not clone the element and always use the template
rowClone.appendTo(tableElement);
});
}
};
这是我在我自己的元素的表格框架中使用的方法(好吧,更高级,但这确实是全局性的想法),允许使用 Angular 功率来渲染单元格内容('getCellTemplate' 实现可以返回html with directive, which will be compiled), using filter even including directives in the cell, but keeping the table rendering logic to myself, to avoid useless ng-repeat watch, 并将编译过热降至最低。
关于javascript - Angular 性能 : critical rendering path?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33825762/
这基本上是 the code I am using灯塔说我的(几乎是空的!)css 包延迟了我的初始加载。 那么我如何在 中放置指向 critical.scss 的链接 DONT_WANT_TO_WR
这实际上是三个不同的概念还是我混淆了? (我一直在阅读有关线程和垃圾收集的文章,但我自己也很困惑。) “关键部分” - 我认为这可能只是您不希望多个线程同时访问的代码部分的术语,即在 lock 和 M
好吧,过去一天我一直在绞尽脑汁试图解决这个问题。我正在尝试为目录中的每个 HTML 文件生成关键 CSS。我当前的工作代码在单个文件上运行良好: export const criticalCSS =
我是 Java 多线程的新手,遇到过以下问题: 问题:线程 1 到 n 执行一个名为 critical() 的方法。在此之前,他们执行一个名为 uncritical() 的方法。它们的同步约束是一次只
来源:晓飞的算法工程笔记 公众号,转载请注明出处 论文: Collective Critics for Creative Story Generation 论文地址:https
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
CRITICAL_SECTION 和 CCriticalSection 之间有什么关系。CCriticalSection 是 CRITICAL_SECTION 的包装器吗? 顺便说一句: 我认为下面的
我正在尝试使用 openMP,并且我有一个永远不能同时运行两次的功能。在另一个世界中,这不是问题: int foo(void){ mutex->lock(); .... mutex->relea
我有多个项目的并行构建,每个项目在某个时间点都会调用 任务。此 exec 任务正在运行 3pty 工具,如果此工具的另一个实例正在运行,该工具会崩溃。有没有一些本地方法如何在 msbuild 中实现“
换句话说:你写了什么代码 不能 失败。我很想听听那些从事过心脏监测器、水测试、经济基本面、导弹轨迹或航天飞机上的 O2 浓度的项目的人的意见。 你是如何准备编写这种代码的:方法论、智力和情感? 编辑
所以我最近开始使用 Perl::Critic 来检查我编写的代码的质量。我正在以残酷的模式运行它,并且它提出了一个我不认为是问题的建议。输出是: 标记函数的返回值被忽略 - 在第 197 行第 13
我已经开始将一个项目转换为 Moose,我注意到的第一件事是我的批评/整洁测试陷入困境。 Moose、Tidy 和 Critic 似乎不像以前那么喜欢彼此了。 是否有任何关于如何让评论家/整洁者更欣赏
案例一: 场景:我有两种不同的方法,每种方法都共享通用的全局资源。 Method1() 被 ThreadA 访问,Method2() 被许多其他线程访问,但不是 ThreadA。 要求 :我的要求是如
我正在尝试使用 Keras 和 Tensorflow 实现 Actor-Critic。但是,它永远不会收敛,我不明白为什么。我降低了学习率,但它没有改变。 代码在python3.5.1和tensorf
一旦我们的软件投入使用,“关键”机器信息将被记录并用于调试目的。 “关键”信息可能包括对调试应用程序“通常”很重要的数据。它可能包括: 操作系统 已安装 Windows 更新 硬件信息:CPU、内存、
我正在编写一个小型数据库接口(interface)并想使用 glayout。 MWE: require(gWidgets) options("guiToolkit"="RGtk2") ### Th
考虑以下代码 //proces i: //proces j: flag[i] = true;
我在另一个线程(由 threading.Thread 创建)中运行一个单独的类方法。我想检查用户是否登录成功。 如果用户没有登录,我想提示一个消息框 QtWidgets.QMessageBox.cri
我在线程 A 中有以下代码,它使用 pthread_cond_wait() 阻塞 pthread_mutex_lock(&my_lock); if ( false == testConditi
我正在寻找对“关键渲染路径”含义的简明解释,特别是关于它与 Web 开发的关系。 最佳答案 The critical rendering path is the series of events th
我是一名优秀的程序员,十分优秀!