android - 测量单个 GUI 元素的加载时间

标签 android ios performance user-interface windows-phone-8.1

我正在编写一个程序来测量每个 GUI 元素(如按钮、文本框等)的加载时间。现在我正在开发 Windows Phone,我计划将其扩展到 Android 和 iOS(可能使用 swift,但尚未决定)和 Java 桌面。

我正在使用按钮的点击事件生成 GUI 元素(在本例中为按钮)

private void btnCreate_Click(object sender, RoutedEventArgs e)
{
    CleanUp(); // to Garbage collect

    watch.Start();
    Button btn = new Button();
    btn.Width = 110;
    btn.Height = 56;
    btn.Foreground = new SolidColorBrush(Windows.UI.Colors.White);
    btn.Content = "Button";
    btn.Click += btn_Click;
    gridMain.Children.Add(btn);
    watch.Stop(); 
}

我使用不同的按钮,在其事件处理程序中使用以下代码来显示结果

private void btnResults_Click(object sender, RoutedEventArgs e)
{
    long ticks = watch.ElapsedTicks;
    double ms = 1000.0 * (double)ticks / Stopwatch.Frequency;
    // show results in a message box
}

我还有一个按钮可以删除生成的按钮和垃圾收集器,这样我就可以删除并重新创建并进行多次读取

private void btnRemove_Click(object sender, RoutedEventArgs e)
{
    gridMain.Children.RemoveAt(3); //the dynamically generated button is at 3
    watch.Reset();
}

问题是我得到了一些不一致的结果。 以下是我的一些结果(不包括第一次运行):

0.6028 ms
0.7217 ms
0.9596 ms
1.3834 ms
0.5626 ms
1.3814 ms
0.7343 ms

我不明白原因。这明显不一致吗?如果是,那么我的方法有缺陷吗?有一个更好的方法吗?谢谢

最佳答案

现在您正在测量构建两个对象(一个 Button 和一个 SolidColorBrush),设置各种属性,将一些东西插入向量(事件处理程序和 children )等,但我认为当您调用 Stop 时该按钮实际上是不可见的(可能仍然需要布局和渲染 channel )。所以你在测量一些随机的东西。

Off-hand(无论怎么想,我都不是 XAML 性能专家)+/- 1ms wall-clock time 的方差用于添加一个 Button 到一个 Grid 似乎是合理的,因为您正在测量(例如,您的计算机同时在做什么?)。如果要进行性能分析,请使用性能分析器工具。

关于android - 测量单个 GUI 元素的加载时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31009869/

相关文章:

java - BottomNavigationView getmaxitemcount

java - List<UsageStats> 返回空

android - Flutter - 如何解决 iOS 和 Android 之间的差异?

ios - MPRemoteCommandCenter 在 iOS 中多次调用处理程序

ios - 如何检测滑动方向、触摸位置等?

ios - 每天在本地通知iOS上在警报正文中设置随机消息的问题

c# - 为什么在循环内使用 List.IndexOf(List.Where()) 时会出现性能问题?

android - 如何恢复现有任务的当前状态

performance - Emacs 诊断 : Org-mode unbearably slow and often stalls

python - 如果经常使用计算结果,我应该将其存储在变量中吗?