【前言】:绝大多数时候,我们只是简单地使用了sf developer console最基础的功能来调试我们的代码,比如查看log,运行测试类,执行soql查询和匿名窗口的代码片段。本篇将着重介绍console的一些高级用法,来说明它是如何帮助我们优化代码以提高性能的。
【情景引入】:A公司想要知道除"Canceled"阶段外的所有Opportunity在不同阶段的数量及价格统计,Developer为此提供了下面代码。为了分析代码的性能,Developer使用了Developer Console和Developer Workbench来查看资源在运行时,影响加载时间的关键因素指标,从而得到优化性能的解决方案。
【代码示例】:OppController.cls & OppPage.vf
public class OppController {
public List<AggregateResult> lstAgg = new List<AggregateResult>();
public OppController() {
lstAgg = [SELECT StageName, SUM(Amount) Amount, COUNT(Id) Total
FROM Opportunity
WHERE IsClosed = false AND StageName != 'Canceled'
GROUP BY StageName];
}
public List<OppAgg> getResults() {
List<OppAgg> lstResult = new List<OppAgg>();
for(AggregateResult ar : lstAgg) {
OppAgg objOppAgg = new OppAgg(ar);
lstResult.add(objOppAgg);
}
return lstResult;
}
class OppAgg {
public Integer Total {get;set;}
public String StageName {get;set;}
public Decimal Amount {get;set;}
public OppAgg (AggregateResult ar) {
Total = (Integer)ar.get('Total');
StageName = (String)ar.get('StageName');
Amount = (Decimal)ar.get('Amount');
}
}
}
<apex:page sidebar="false" controller="OppController">
<apex:pageBlock title="Sales Aggregate">
<apex:pageBlockTable value="{!Results}" var="ar">
<apex:column headerValue="Stage Name" value="{!ar.StageName}" />
<apex:column headerValue="Total Amount" value="{!ar.Amount}" />
<apex:column headerValue="No of Opportunities" value="{!ar.Total}" />
</apex:pageBlockTable>
</apex:pageBlock>
</apex:page>
页面效果预览:
【性能检测】:
额外分析工具:Developer Workbench
【结果及方案】:
我们通过性能数发现影响性能的关键因素时DB查询,并通过Timeline我们能更直观的看到查询在整个资源运行时耗时较长,因此,我们可以通过优化查询来解决这一事件的性能问题。
【常用快捷键】:
1. 查看快捷:Ctrl + Shift + "/";
2. 打开并检索资源(特别是查看某对象的字段定义):Ctrl + Shift + "O";
3. 关闭console窗口中的所有Tab:Ctrl + Alt + "/";
4. 打开原生Log:Ctrl + Shift + "G";
5. 查看Log Panels -> Select panels for current log(因此你必须先打开Log才能使用快捷键调出):Ctrl + "P";
常用配置:
6. 使用Debug -> Switch Perspective -> Analysis (Predefined) -> Timeline查看占用时间较长的项;
【拓展与延伸】:事务中保存顺序监测
【参考资源】:Log Inspector