广告
返回顶部
首页 > 资讯 > 后端开发 > Python >UITableView性能提升和优化(第
  • 637
分享到

UITableView性能提升和优化(第

性能UITableView 2023-01-31 03:01:42 637人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

接上一篇翻译的内容。再次运行测试在重用cell之后,你可以再一次测试滚动性能。从表格3-3可以看出,在你正确重用cell之后,性能提升了一倍。表格 3-3 重用cell之后测试的结果结果显示你的做法是正确的;但是,现在的性能依然不够好。你总

接上一篇翻译的内容。


再次运行测试


在重用cell之后,你可以再一次测试滚动性能。从表格3-3可以看出,在你正确重用cell之后,性能提升了一倍。

表格 3-3 重用cell之后测试的结果


结果显示你的做法是正确的;但是,现在的性能依然不够好。你总是想让性能上升至0.6666-0.0001左右;对于一个标准的UITableViewCell这是一个正常的性能,就像在第一部分展示的那样。所以下一部分将要学习如何重用p_w_picpaths,而不是每次调用的时候都创建一个新的p_w_picpath。


这就是你为什么要重用cell的原因。对于OS来说,创建和加载一个新的cell到内存中,都是要花费时间和内存资源的。这就是为什么tableview总是queue 一个cell进行重用,无论这个cell是否在屏幕之外。如果你重用cell,OS就不需要创建一个新的cell来显示;它只需要获取旧的cell,改变一些属性,然后重新显示这个cell。这个过程比OS创建一个新的cell要快的多。


重用图片


显示图片的主要问题在于加载的时间,要么通过文件系统io,要么通过网络IO,都是非常耗时的。这个加载过程同样会影响到滚动性能,当iOS不能返回cell来渲染UI时。


由于这个原因,请参考ReuseImageViewController这个给工程。首先我解释一下在这些例子中,我为什么没有使用[UIImage p_w_picpathd:@""]。p_w_picpathNamed做了一项非常重要的工作:它会在内存中缓存图片,当你再次访问的时候会重用它。使用这个方法的问题是它只能从bundle中获取文件 --- 换句话说,图片只能和app的源代码放在一起。通常,你必须调用方法[UIImage alloc] initWithContentsOfFile:@""];或者[UIImage alloc] initWithData:data]]。调用这些方法,OS不会自动的在内存中缓存图片。


所以,我希望你通过一个小的dictionary在内存中存储图片,来自己缓存图片(请看第4章)。另外一个图片处理非常重要的部分是多线程(请看第6章)。使用这个技术,你可以把耗时的的处理任务放到当前线程之外。在我的当前例子中,不会使用多线程,因为你必须立即了解很多新的概念。在本章结束的时候,你应该自己做完这个练习。


这是在NSDictionary缓存图片的主要代码(请不要使用这种方式存储图片,因为它会导致内存警告)。


// Code to store the p_w_picpath in the dictionary- (UIImage *)p_w_picpathWithName:(NSString *)name {

if ([self.p_w_picpathDictionary objectForKey:name]) {return [self.p_w_picpathDictionary objectForKey:name];

}

UIImage *p_w_picpath = [[UIImage alloc] initWithContentsOfFile:name];[self.p_w_picpathDictionary        setObject:p_w_picpath forKey:name];
return p_w_picpath;

}


下面这个是提取最近一次图片的主要代码。


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

   static NSString *CellIdentifier = @"CellIdentifier";

   ReuseTableViewCell *cell = (ReuseTableViewCell *) [selfgetCellWithTableView:tableView     cellIdentifier:CellIdentifier nibName:@"ReuseTableViewCell"];


   NSString *avatarFile = [NSString stringWithFORMat:@"a0"];
   NSString *avatarName = [[NSBundle mainBundle] pathForResource:avatarFile ofType:@"jpeg"];

   cell.avatar.p_w_picpath = [self p_w_picpathWithName:avatarName];

   cell.userName.text = [NSString stringWithFormat:@"hi here: %d", indexPath.row];// Configure the cell.

   return cell;
}


代码更新之后,你再运行一下测试。从表格3-4来看,你得到了一个更好的结果。现在的平均运行时间是0.002,fps的性能现在接近60。和之前的ReuseTableView相比,你得到了一个更好的性能。


表格 3-4 在重用图片之后的测试结果


好极了!fps现在几乎是60了,预加载的时间也降低了。如果你的apps能够达到这个水平,你不必再担心滚动时的性能了;它非常的流畅。通常,对于一个正常的,简单的里面包含很多subviews的UITableView来说,这已经是一个非常好的性能了。这样是非常好的,因为你不必在开始的时候就做很多工作。如果滚动的性能依然不好,你就必须使用一个更好但是更复杂的方式来达到同样的性能。


正如在第1章和第2章提到的,你应该总是小心谨慎,避免过度优化。为了一个很小的性能优化而浪费太多的时间是非常不值得的。因此从这点考虑,如果你的应用依然存在滚动性能方面的问题,你应该转到第2个例子,它使用到了UITableViewCell的绘制技术。


减少预加载时间


通常,我会通过缓存来重用图片,同时减少初始化的过程。当OS需要为TableView渲染一个新的cell,会通过调用下面的方法来返回一个新的cell:

- (UITableViewCell *)tableView:(UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath {

// Initialize and return the Cell here

}


因此,如果你在这里阻塞了太长的时间,UserInterface渲染的过程就会被阻塞;它将不能做任何事情或显示任何新的东西。这就是为什么用户看到在某个地方滚动停止的原因。


为了使这个过程尽可能的快,你可以去除一些逻辑,延迟计算,通过重用来缓存数据和图片。另外一个方法是通过首先使用默认的图片和数据来重用cell。当要获取图片或数据的时候,你可以使用多线程,然后稍后进行填充。从用户的角度来看,这种方法将会使得滚动更加流程,加载图片的速度更快。


第二个例子


当你有很多subviews或使用老的设备,绘制一个自定义的cell能够提升应用程序的性能。对于iPhone4和以后的设备,有一个非常显著的性能提升,因此你将会看到绘制自定义cell技术会有一个很大的不同。


在这个例子中,我会增加cells的复杂度,这是来自一个真实的应用,每一个cell有10个subviews,包括图片和文件。因此,你会看到很多真实的应用(像Facebook,这是我们尝试模拟的),滚动性能会被复杂的subviews结构严重影响到。我测试的应用有一个类似图 3-5这样的一个用户界面。

图 3-5 第二个应用例子


每一个cell包含一个头像,用户名,邮件的图片,标题和内容。它同时也显示了应用发送邮件的时间。测试结果图表格3-5。


表格3-6显示了运行自定义绘制代码的结果

从表格3-5和3-6可以看出,使用自定义绘制代码能够显著的提升渲染性能。在使用复杂的subview这点上,这个性能已经足够好了,你不必需要其他的优化了。


对于没有优化的cell,它将会创建很多的components和subviews。请查看图3-5,确保你理解了这个问题。




暂时翻译到这里,有时间继续!


--结束END--

本文标题: UITableView性能提升和优化(第

本文链接: https://www.lsjlt.com/news/187609.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • UITableView性能提升和优化(第
    接上一篇翻译的内容。再次运行测试在重用cell之后,你可以再一次测试滚动性能。从表格3-3可以看出,在你正确重用cell之后,性能提升了一倍。表格 3-3 重用cell之后测试的结果结果显示你的做法是正确的;但是,现在的性能依然不够好。你总...
    99+
    2023-01-31
    性能 UITableView
  • PHP7性能优化如何提升
    这篇文章主要介绍“PHP7性能优化如何提升”,在日常操作中,相信很多人在PHP7性能优化如何提升问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP7性能优化如何提升”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-21
  • ApacheHudi性能提升三倍的查询优化
    目录1. 背景2. 设置3. 测试4. 结果5. 总结从 Hudi 0.10.0版本开始,我们很高兴推出在数据库领域中称为 Z-Order 和 Hilbert 空间填充曲线的高级数据...
    99+
    2022-11-13
  • golang WebSocket性能优化:提升响应速度和吞吐量
    Golang WebSocket性能优化:提升响应速度和吞吐量,需要具体代码示例摘要:WebSocket是一种用于建立客户端和服务器间全双工通信的协议,被广泛应用于实时聊天、数据传输等方面。然而,随着应用规模的增大,WebSocket的性能...
    99+
    2023-12-17
    Golang 性能优化 websocket
  • .NET使用Collections.Pooled提升性能优化的方法
    目录简介Collections.Pooled如何使用性能对比PooledList<T>PooledDictionary<TKey, TValue>Pooled...
    99+
    2022-11-13
  • php-fpm怎么进行优化来提升性能
    这篇文章主要讲解了“php-fpm怎么进行优化来提升性能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php-fpm怎么进行优化来提升性能”吧!PHP是无处不在的,可以说是互联网 Web 应...
    99+
    2023-06-30
  • 怎么优化提升seo技能
    这篇文章主要为大家展示了“怎么优化提升seo技能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么优化提升seo技能”这篇文章吧。  第一,不能很好的把握优化之间度的问题。尤其是在进行内容和外链...
    99+
    2023-06-10
  • 阿里云升级服务器系统提升效率,优化性能
    随着云计算技术的快速发展,阿里云作为国内领先的云计算服务商,一直在不断提升其服务的稳定性和安全性。近期,阿里云又对服务器系统进行了升级,以满足用户对于更高效率和性能的需求。本文将详细介绍阿里云服务器系统升级的具体内容和带来的影响。 阿里云服...
    99+
    2023-10-29
    阿里 效率 性能
  • 提升电脑性能和优化电脑系统的操作方法
    这期内容当中小编将会给大家带来有关提升电脑性能和优化电脑系统的操作方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。什么是系统优化  答:系统优化模块,将“清理垃圾”、“清除痕迹”、“清理插件”、“开机加...
    99+
    2023-06-14
  • PHP底层的代码优化与性能提升实战
    PHP是一种广泛应用于Web开发领域的开源服务器脚本语言,其简洁易学、功能强大、能够和众多开源数据库完美搭配等优点,让它在Web应用开发中大放异彩。然而在开发过程中,往往需要考虑PHP性能的问题。本文将介绍PHP的性能优化与提升实战,同时附...
    99+
    2023-11-08
    性能 优化 PHP
  • go time.After优化后性能提升34%内存减少67%
    目录正文改进1:分析问题时间轮正文 大家好,今天给大家带来一篇如何优化time.After函数。 最近我在做调度中心2.0的重构。本次重构使用的GO语言开发。 在项目中,基本都离不...
    99+
    2023-02-24
    go time.After优化性能内存 go time.After
  • 如何实现MySQL底层优化:日志系统的优化与性能提升
    MySQL是目前最流行的关系型数据库管理系统之一,作为网站及应用程序后端的核心组件,其性能优化显得尤为关键。其中,日志系统是MySQL的重要组成部分,其性能对数据库的整体性能影响极大。因此,本文将深入讨论MySQL日志系统的优化和性能提升。...
    99+
    2023-11-08
    MySQL 优化 日志
  • DB2性能优化 – 如何通过db2优化工具提升SQL查询效率
           我们都知道,应用系统在运行一段时间后,用户报告系统运行会变慢,使他们不能完成所有的工作,完成事务和处理查询花费过长时间,或者应用程序...
    99+
    2022-10-18
  • C#开发建议:提升代码质量与性能优化
    C#开发建议:提升代码质量与性能优化在当今软件开发行业中,C#作为一种广泛应用的编程语言,被用于开发各种类型的应用程序,涉及各种规模的项目。然而,随着项目规模的扩大和软件应用的功能复杂性增加,开发人员在开发C#应用程序时往往面临着提升代码质...
    99+
    2023-11-22
    性能优化 代码质量 C#语言
  • Python性能提升之延迟初始化
    所谓类属性的延迟计算就是将类的属性定义成一个property,只在访问的时候才会计算,而且一旦被访问后,结果将会被缓存起来,不用每次都计算。构造一个延迟计算属性的主要目的是为了提升性能 property 在...
    99+
    2022-06-04
    初始化 性能 Python
  • PHP开发技术:从日志加载优化到性能提升
    PHP开发技术:从日志加载优化到性能提升 PHP作为一门流行的服务器端脚本语言,应用广泛。在开发过程中,我们不仅要关注代码的正确性,还要注重代码的性能。本文将介绍如何通过优化日志加载和提高性能来优化PHP开发。 优化日志加载 日志是开发...
    99+
    2023-10-08
    load 日志 开发技术
  • 优化Windows以提高性能
    以下是一些优化Windows以提高性能的方法:1. 清理磁盘空间:删除不需要的文件和程序,清理浏览器缓存,并定期进行磁盘清理。2. ...
    99+
    2023-09-12
    Windows
  • PHP缓存优化:掌握数组和NumPy技巧,快速提升网站性能!
    在现代互联网中,网站的性能是至关重要的。对于PHP开发人员来说,缓存是提高网站性能的一个重要方面。本文将介绍一些PHP缓存优化的技巧,包括数组和NumPy技巧,以帮助您快速提升网站的性能。 一、使用数组来存储数据 在PHP中,数组是一种非...
    99+
    2023-08-13
    缓存 数组 numpy
  • .NET使用结构体替代类提升性能优化的技巧
    目录前言现实的案例内存占用计算速度总结附录前言 我们知道在C#和Java明显的一个区别就是C#可以自定义值类型,也就是今天的主角struct,我们有了更加方便的class为什么微软还...
    99+
    2022-11-13
  • 通过MySQL优化提升系统性能的项目经验分享
    通过MySQL优化提升系统性能的项目经验分享引言:在当今信息化的时代,大量的数据涌入系统,对于数据库的管理和性能优化变得尤为重要。MySQL作为一款广受欢迎的关系型数据库管理系统,具有开源、稳定、高性能等特点,被广泛应用于各个行业中。本文将...
    99+
    2023-11-02
    MySQL优化 系统性能 项目经验
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作