我刚刚在Performance Tips and Tricks for Flex and Flash Development观看了这个视频,它列出了使用和创建Flex时测量的3件事。
如何在自己的项目中测量这些项目?在我的情况下,更具体地说,对于这个问题,我如何测试创建项目渲染器,验证它并渲染它需要多长时间?
在测试项目渲染器的性能时,所有这些事件的总和是我应该使用的总时间吗?我的意思是一旦它被创建,那么重要的是渲染和验证是否正确?
我的意思是如果我有一个项目渲染器我认为我可以通过使用以下代码找出创建时间:
<itemrenderer initialize="trace('initialized at='+getTimer())" creationComplete="trace('created at='+getTimer())" />
不确定这是否正确。但是验证和渲染呢?
答案 0 :(得分:1)
你走在正确的轨道上。
要点是从getTimer获取两个值,并使用差异来确定操作所花费的时间。
理想情况下,你是第一个getTimer()将在构造函数中。如果您正在处理MXML组件;没有构造函数所以我会使用preinitialize事件。我们可以拨打这个号码timer1。
组件初始化完成时会触发creationComplete事件。这包括第一个'渲染'事件。我们可以称之为nnumber timer2。
执行:
timer2-timer1
跟踪Flex Component生命周期的创建部分。这还将包括第一个渲染过程。
出于Flex组件的目的;我会说Render是运行commitProperties(),measure()和updateDisplayList()的过程。跟踪这个的诀窍是你不知道将调用哪一个 - 如果有的话 - 因为它取决于失效的内容。
验证是一个持续的过程,因为组件运行;这导致组件被重新渲染。
我可能会听render事件启动你的计时器;以及跟踪组件渲染完成时的updateComplete事件。
答案 1 :(得分:0)
这是我到目前为止所得到的:
timeLabel.text += "\nAbstractDataGridItemRenderer: " + testGridItemRenderer(AbstractDataGridItemRenderer, data, 50);
功能:
public function testItemRenderer(renderer:Class, data:Object, iterations:int = 1000, resetTime:Boolean = false):int {
var layoutManager:LayoutManager = LayoutManager.getInstance();
var time:int = getTimer();
var itemRenderer:IItemRenderer;
for (var i:int;i<iterations;i++) {
itemRenderer = new renderer();
itemRenderer.data = data.name + i;
itemRenderer.width = 300;
itemRenderer.height = 30;
itemRenderer.y = i * 30;
itemRenderer.label = LabelUtil.itemToLabel(data, "label");
addElement(itemRenderer);
//trace("initialized = " + ILayoutManagerClient(itemRenderer).initialized);
layoutManager.validateClient(ILayoutManagerClient(itemRenderer), false);
//trace("initialized = " + ILayoutManagerClient(itemRenderer).initialized);
}
if (resetTime) {
time = getTimer();
for (i=0;i<iterations;i++) {
itemRenderer.data = data.name + i;
itemRenderer.label = LabelUtil.itemToLabel(data, "label");
//addElement(itemRenderer);
//trace("initialized = " + ILayoutManagerClient(itemRenderer).initialized);
layoutManager.validateClient(ILayoutManagerClient(itemRenderer), false);
//trace("initialized = " + ILayoutManagerClient(itemRenderer).initialized);
}
return getTimer() - time;
}
return getTimer() - time;
}
我不知道这是否正确,但它给了我一些数字。我宁愿不把它添加到舞台上,但似乎我必须这样做才能让它初始化。
当一个对象通过所有三个对象时,Initialized为真 布局阶段:承诺,测量和布局。
更新。我添加了重置阶段。这离开了渲染阶段。