For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
随着互联网的不断发展,越来越多的app与pc软件被开发推广上线,而本文我们就通过案例分析来简单了解一下,软件开发性能调优常用方法都有哪些。
预处理/后处理
提前处理
预处理主要是为了提速。比如CPU和内存的预取操作,将内存中的指令和数据,提前存放到缓存中,从而加快执行的速度。
决策引擎为了保证策略的执行RT控制到200ms内,需要优化压缩执行策略的时间,假设一个策略再怎么优化,执行时间也是超过200ms的,那此时可以在上一个事件(场景)提前触发预处理操作。
举例:用户发单时需要判定群组风险,但访问群组是比较耗时,那可以在用户进入发单前先触发查询群组信息并缓住,真正发单时直接读取上次结果即可。同样的,我们可以在用户登录时触发一些操作,利于后续风控事件感知。
延后处理
不到必要时刻坚决不执行,节省成本。运用这一策略有名的例子,就是COW(CopyOnWrite,写时复制)。假设多个线程都想操作一份数据,一般情况下,每个线程可以自己拷贝一份,放到自己的空间里面。但是拷贝的操作很费时间。系统如果采用惰性处理,就会将拷贝的操作推迟。如果多个线程对这份数据只有读的请求,那么同一个数据资源是可以共享的,因为“读”的操作不会改变这份数据。当某个线程需要修改这一数据时(写操作),系统就将资源拷贝一份给该线程使用,允许改写,这样就不会影响别的线程。
延后操作在风控中主要为了节省成本,决策引擎为了极致的性能,很多变量(或者叫特征/指标)都是一次性并行加载的,但此时有的变量是三方收费指标,比如IP、同盾、蚁盾等,预加载的好处显而易见,但是也极大的增加了成本:用户有可能还未走到付费变量决策节点时就被拒或者白名单直接通过,此时这部分用户提前请求三方就是极大的浪费。只有真正走到付费策略时,才会去请求,此时成本小。
并行/异步操作
并行
一个人干不完的活,那就多找几个人一起干!并行操作,处理效率高(前提是机器多核心),时间大大缩短,极大缩短了RT时间。绝大多数互联网服务器,要么使用多进程,要么使用多线程来处理用户的请求,以充分利用多核CPU。另外一种情况就是在有IO阻塞的地方,也是非常适合使用多线程并行操作的,因为这种情况CPU基本上是空闲状态,多线程可以让CPU多干点活。
决策引擎如果执行策略都是同步执行的话,几分钟可能都执行不完,运用并行,充分发挥CPU多个核心的性能,那么此时性能瓶颈就是长的那块木板,只要专攻优化它就好了。
异步
异步相对同步来说,就是是否等待结果还是立即返回。同步操作在碰到内部有大量I/O操作时,性能损耗极大,此时采用异步操作,系统的吞吐行会有极大的提升。但是有利有弊,异步操作也增加了程序的复杂度,需要考虑失败补偿等额外的操作。
此类场景在风控系统中也是随处可见:
MQ消息:天然的异步处理,依托于消息消费机制削峰填谷特性,在大耗时操作动作,且业务不需要同步返回情况下,非常适合用消息来处理,比如离线决策。
埋点、监控采样:不在业务关心的流程内发起的操作,为了不影响RT,需要将额外的操作异步处理。
缓存/批量合并
数据缓存
缓存的目的就是为了加速,这个我们从学习程序语言开始就基本达成的共识,基本上各个系统内只要有性能考虑的,多少都会用到缓存。我们常用的一些工具,也穿插了缓存的影子,比如:
IOC控制反转:不仅仅是依赖注入,同时也节省了创建bean的时间
线程池中活跃线程:池化概念目的是增速,池本身就是一个缓存容器,频繁的创建池内对象,得不偿失,此时固定一批在池内,用完即还,极大的避免了创建新对象的开销。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。