本文已参与「新人创作礼」活动,一起开启掘金创作之路。
前言
绝大多数时候,我们只是简单地使用了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我们能更直观的看到查询在整个资源运行时耗时较长,因此,我们可以通过优化查询来解决这一事件的性能问题。
常用快捷键
- 查看快捷:Ctrl + Shift + "/";
\
- 打开并检索资源(特别是查看某对象的字段定义):Ctrl + Shift + "O";
\
- 关闭console窗口中的所有Tab:Ctrl + Alt + "/";\
- 打开原生Log:Ctrl + Shift + "G";
\
- 查看Log Panels -> Select panels for current log(因此你必须先打开Log才能使用快捷键调出):Ctrl + "P";
常用配置:
\
- 使用Debug -> Switch Perspective -> Analysis (Predefined) -> Timeline查看占用时间较长的项;
拓展与延伸:事务中保存顺序监测