程序员面试闪充 -- 性能优化

CPU 和GPU

关于绘图和动画有两种处理方式CPU(中央处理器)和GPU(图形处理器),CPU的工作都在软件层面,而GPU的在硬件层面。
总的来说,可以使用CPU做任何事情,但是对于图像的处理,通常GPU会更快,因为GPU使用图像对高度并行的浮点运算做了优化,所以,我们想尽可能的把屏幕渲染的工作交给硬件去处理,而问题在于GPU并没有无限制处理的性能,一旦资源用尽,即使CPU并没有完全占用,GPU性能还是会下降。
所以,目前大多的性能优化都是关于智能利用GPU和CPU,平衡它们之间工作负载。

Xcode自带调试工具

Instruments

Instruments是Xcode套件中没有被充分利用的工具,很多iOS开发者从来没用过Instrument,很多面试官也会问性能条调优方面的知识,来判断大家到底拥有几年开发经验。
打开instruments有两种方式。一是通过open Developer tool打开,二是使用product选项的profile。


  • core animation


Core Animation工具是用来检测Core Animation性能的,用来查看界面是否卡顿。在这里可以查看到刷新帧率和离屏渲染的效果。手机屏幕所显示的内容都是一个个点组成的。组成的屏幕上完整的一张图片称为一帧。帧率是指一秒钟的时间内重新绘制屏幕多少次。人眼的频率是24,为了保证屏幕的流畅度,刷新帧率应该在50+。在两帧刷新运算没有做完,让用户产生卡顿的感觉如果要提高性能,最关键的是要减少计算量。计算量减少了就能保证每一帧都完成计算,从而达到流畅的效果。


第一个调试选项"Color Blended Layers"正是用于检测哪里发生了图层混合,并用红色标记出来。因此我们需要尽可能减少看到的红色区域。一旦发现应该想法设法消除它。开始调试后勾选这个选项,

第二个调试选项是“Color Hits Green and Misses Red”,它表示如果命中缓存则显示为绿色,否则显示为红色,显然绿色越多越好,红色越少越好。

第三、四个选项的使用场景不多,我们直接看一下第五个选项“Color Misaligned Images”。它表示如果图片需要缩放则标记为黄色,如果没有像素对齐则标记为紫色。

第六个选项“Color Offscreen-Rendered Yellow”会把需要离屏渲染的地方标记为黄色,大部分情况下我们需要尽可能避免黄色的出现。离屏渲染可能会自动触发,也可以手动触发。

  • leaks

用来查看app运行期间,那些代码产生内存泄露。
内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间。作为用户,根本感觉不到内存泄漏的存在。但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。


点击小红点运行,如果在3区域有红X出现, 则有内存泄露, 4区域则会显示泄露的对象。打用leaks进行监测:点击泄露对象可以在(下图)看到它们的内存地址, 占用字节, 所属框架和响应方法等信息.打开扩展视图, 可以看到右边的跟踪堆栈信息,4 黑色代码最有可能出现内存泄漏的方法

  • Time Profiler

在开发的过程中,我们经常能感觉到,点击某一按钮,或者做了某一操作,会出现卡顿的现象,被称为延迟。使用Time profile工具,就可以揪出耗时的函数。


选择需要调试的项目,勾选安装线程分割和隐藏系统的函数。就可以在下方查看相关的耗时操作,右键定位到耗时的方法,打开代码就能很快解决问题。

Activity Monitor

类似于任务管理器,可以查看所有的进程,以及进程的内存、cpu使用百分比等数据等

Allocations

管理内存是app开发中最重要的一个方面,对于开发者来说,在程序架构中减少内存的使用通常都是使用Allocations去定位和找出减少内存使用的方式。

面试题

问题一:
在开发中,如何去优化tableview呢?
答:

  • 行高一定要缓存: 行高方法其实被调用的次数非常多。通过缓存行高,可以减少大量计算自动布局的过程。

  • 不要动态创建子视图:当cell显示的时候,不要再去创建了。所有的自视图都应该预先创建,如果不需要显示可以设置hidden。

  • 所有的子视图都必须制定背景颜色

  • 所有的颜色都不要使用alpha:设置alpha会增加图层的计算,对性能的消耗非常之大。

  • cell栅格化

-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    
    if(self){
        //栅格化
        self.layer.shouldRasterize = YES;
        // 栅格化必须指定分辨率,否则默认使用 *1 生成图像
        self.layer.raterizationScale = [UIScreen mainScreen].scale;
    }
    return self;
}
  • 异步绘制
self.layer.drawsAsynchronously = YES;

问题二:
SDWebimage 在内存方面存在很大的问题,如何解决动态图片内存不释放的问题?

答:SDWebimage 在内存方面存在很大的内存问题,静态的图片也会出现拉伸问题,动态的gif图内存峰值更加的高,内存释放不会及时。
1、利用CADisplayLink开启一个时钟,每次触发只加载一帧图像!而之前的图像立即释放。

2、用加时钟的方式来解决内存过大的问题,会造成额外的开销。可以将动态图片的加载换成YYAnimatedImageView。

问题三:
平时你是如何对代码进行性能优化的呢?

答:利用性能分析工具检测,使用instrument调试界面卡顿,timer Profiler用来看cpu的占比,core animation用来获取图形的绘制情况。使用静态工具analyze分析代码的声明错误、逻辑错误、Api调用错误或内存管理错误。

问题四:
如何对I/O进行性能优化?

答:将零碎的内容作为一个整体进行写入;使用合适的 I/O 操作 API;使用合适的线程;使用 NSCache 做缓存达到减少 I/O操作的效果。

视频地址: 性能优化详解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容