感叹在开发中冥思苦想后灵光一现的那些思路

前言

我觉得开发技术的提升不仅仅是知识含量的增加,更重要的是开阔自己的思路,在解决同样的问题时方案能够更胜一筹,让程序能够更有效率,更优雅。这些思路往往都是在冥思苦想后的灵光一现。下面我举几个例子,包括 JSPatch 的方法调用思路,微信读书如何处理数据层卡顿,微信终端跨平台组件 mars 里日志模块 xlog 的性能优化方案,以及自己在 SMCheckProject 项目中对使用方法的解析思路。

JSPatch中的方法调用

JSPatch作者 bang《JSPatch实现原理详解》 这篇博客中提到方法调用的实现比如 UIView.alloc() 在开始时为了能够让这个方法调用,需要给 UIView 对象添加 alloc 方法。由于 JS 没有 OC 那样的转发机制,所以 bang 开始的时候采用了一个复杂的方式,在 require 生成类对象时通过类名用 Runtime 的方法找出此类所有方法,然后 JS 为每个方法生成一个函数,这样的函数用方法名去 OC 调用对应的方法。

这样的想法可行,但是效率性能难以接受,消耗的增长是指数级的。因为不光是当前的类需要遍历,父类直到顶层都需要,会出现内存消耗过度的问题。后来 bang 苦苦找解决方案,突然脑洞大开,想到如果能够实现调用一个不存在的方法能够转发到一个指定函数执行就好了,于是把 JS 里方法调用都替换掉改成调用 __c() 函数,把相关信息传给 OCOC 再用 Runtime 来调用相应的方法返回结果。这样做不用遍历,不用保存方法,我觉得这种脑洞大开想到的方案的这种思路是非常值得学习,当一种思路越陷越深时,要时刻提醒自己,跳出来再看看,是不是还有其它的路可以走。

微信读书处理数据层卡顿

WeRead团队博客里有篇文章 《微信读书 iOS 质量保证及性能监控》 介绍了他们对数据层的性能监控。他们数据层使用的是 YDataCenter,在这个数据层框架里一次 SQL 的完整操作要经过等待 cache 队列,放入 cache 队列执行,等待 db 队列,放入 db 队列四个步骤。将这四个步骤的时间和对应 SQL 记录下来,因为这样的 SQL 操作较多,所以只将超过指定时间的记录下来,这样能以最小的代价找出那些造成阻塞卡顿的 SQL 和场景出来进行优化。

日志文件写磁盘导致大量IO引起程序卡顿

微信团队在介绍他们微信终端跨平台组件 mars 里的日志模块时提到了他们对日志写磁盘处理的考虑过程。一般的简单的处理都会采取两次数据拷贝实现写入磁盘,第一次是从用户空间内存拷贝到内核空间的缓存,第二次是回写内核空间的缓存到磁盘。但是频繁的空间切换使得应用层的性能不可控。

一般为了解决空间切换都会采用先将日志缓存到内存中,达到设置的大小后再压缩加密写入文件,但是这个方案的压缩还是会有让 cpu 飙升的可能,还有个很严重的丢日志的问题。如何能够完美处理呢。

mars 的日志模块 xlog 最终采用了 mmap 这种内存映射文件的方法来作为一个既能够有直接写内存的性能,又具有直接写文件可靠性的方案。从测试来看写内存和写 mmap 的耗时几乎是一样的。

SMCheckProject项目中对使用过的方法的解析

SMCheckProject 这个项目有需要解析出所有使用过的方法,一开始会想到使用递归,以前我做 STMAssembleView 中对自定义的 DSL 语言解析时就是使用的递归,这样时间复杂度就会是 O(nlogn) ,这次我换了个思路,将复杂度降低到了 n ,思路大概是 创建一个字典,键值就是深度,模拟语法树结构,从左到右深度的增加根据 [ 符号,减少根据 ] 符号,值会在 [ 时创建一个 Method 结构体,根据 ] 来完成结构体,将其添加到 methods 数组中 。 这种优化在项目小文件少时看不出很大的区别,但是在项目规模非常庞大时却能将总时间省掉不少。

灵光一现后需要付出的努力

当然光是有个好的思路和想法是完全不够的,为了能够实现思路也是八方英雄各显神通。从有了利用编译原理中分析语法转换语法这个思路进行动态化开始,逐步演化到开发一套全自动编译器实现OC源码转字节码后通过自建虚拟机与Native运行时互联。下面我列出些相关的文章,可以看到大量的基础知识积累是这些好的思路必备的基础,光是有着灵活的大脑也是不够的。

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

推荐阅读更多精彩内容

  • 刘未鹏和李笑来都建议写东西越早越好. 所以就记录点随笔, 以后觉得能对别人有大点的用处, 就不断的改版...老师们...
    Justin_Zhai阅读 333评论 0 0
  • 红豆一生中孤独的人, 每天早出晚归, 为了三餐, 为了生活, 对着各种人与事, 心谈了。 当某天,红豆在公车上遇见...
    红豆遇见抹茶阅读 495评论 1 3
  • 未经体验的情绪是不好说自己可以控制的。就像没当过尚说和尚不过就是个吃素的一般胆大无脑。 今天的雨和之前的雨没有不同...
    君子包阅读 338评论 1 4