性能问题:查看时间负载随着时间的推移而增加

Posted

技术标签:

【中文标题】性能问题:查看时间负载随着时间的推移而增加【英文标题】:Performance Issue: Time Load to View Increasing Over Time 【发布时间】:2013-12-15 16:49:33 【问题描述】:

我正在使用 UINavigationController 开发 ios 应用程序。我遇到了性能问题,每次加载视图时,加载新视图所需的时间增加约 0.1 秒。我希望有人可以就如何解决这个问题提供一般性建议。

我在下面包含了分析数据。似乎没有任何无限增长或内存泄漏。

有关该应用程序的更多信息:它具有相当数量的视图(超过 20 个),并且具有相当复杂的表格视图,其中包含许多不同的自定义单元格。我使用一个基础视图控制器,其中包含我为每个单独的视图控制器子类化的所有表格视图和导航代码。

以下是加载显示此性能问题的视图的示例代码:

-(IBAction)evaluateTapped:(id)sender


  NSArray *arrayOfPropertiesToLoad =    [self.sharedStore requestAnArrayOfObjectsWithEntityDescription:@"Property" forWhichAttribute:@"isEvaluated" isEqualTo:[NSNumber numberWithBool:YES]];

NSArray *sortedArray =    [[OzStore sharedStore] sortArray:arrayOfPropertiesToLoad withKey:@"id" ascending:NO];
    NSMutableArray *mutSortedArray = [NSMutableArray arrayWithArray:sortedArray];

    OzEvaluatePropertyListViewController *propertyList = [[OzEvaluatePropertyListViewController alloc] initWithNibName:nil bundle:nil withSortedDataArray:mutSortedArray useCellClass:@"OzPropertyCell" withUnit:nil];

    [self.navigationController pushViewController:propertyList animated:YES];

【问题讨论】:

您是否尝试过时间分析以查看在额外时间内发生了什么?另外,显示一些关于视图创建的代码——那里有循环吗? 除了 Time Profiler 工具之外,您还可以在代码中的各个点调用 CFAbsoluteTimeGetCurrent() 并查看花费最多时间的位置 我使用了时间分析,似乎所有最耗时的方法都会增加时间。最上面的方法是 cellForRowAtIndexPath。我有很多子视图的自定义 UITableViewCells,我认为这会损害我的表现。然而,仅此一点并不能解释为什么我的表现会随着时间的推移而恶化。 【参考方案1】:

我想通了!经过大量广泛的测试后,我意识到每次加载和弹出视图控制器时,导致viewWillAppear 的方法的时间大致相同。但是,每次加载视图时,viewWillAppearviewDidAppear 之间的时间增加了大约 0.1 秒。使用计时器进行分析表明 layoutSubViews 花费的时间越来越多。

原来我在所有视图控制器的父 viewDidLoad 方法中都有以下代码:

 [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"bluecool"] forBarMetrics:UIBarMetricsDefault];


     NSDictionary *a = [NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"Avenir-Light" size:20], NSFontAttributeName,
     [UIColor whiteColor], NSForegroundColorAttributeName, nil];

     [[UINavigationBar appearance] setTitleTextAttributes:a];

每次调用viewDidLoad 时,它一定是在导航栏上添加了一层额外的背景图像。我只是将此代码移至 appDelegate,因此仅调用它并解决了问题。

【讨论】:

以上是关于性能问题:查看时间负载随着时间的推移而增加的主要内容,如果未能解决你的问题,请参考以下文章

性能常见术语

性能测试-5.性能测试理论知识2.0

Apache Flink - 检查点数据大小随着时间的推移而增加

应用程序冻结但 CPU 使用率随着时间的推移而增加

swift spritekit 随着游戏时间的推移增加重力?

Infinispan 集群锁性能不会随着节点的增加而提高吗?