【算法】BinarySearch--二分搜索-折半查找法

前两天阅读SparseArray时看到里面查找数组中是否已经包含某key时使用了binary search方法,其中还使用了一些位操作,今天简单分析一下

wiki 图示:(Link)

binary search wiki pic.png

Android中util.ContainerHelpers中的实现api:

binary search.png

排序前提:array本身已为有序数组

查找过程:
0.向右无符号移位1位,得到middle位值;
1.以mid为准比对midIndex位置值与参数value大小,大则hi位移至现mid位前一位,小则lo位移至现mid位后一位,相等则返回mid;
2.重复以上过程直至不满足循环条件或是又查找结果

从low、high可以看出,结果返回的是value在数组中对应的index,如果为负则代表不存在(最后一行,返回~lo会得到一个负数,因为lo计算结果一定为正,个人感觉直接返回一个负数可以连按位取反都省略掉,是不是性能更优?)


Java 位操作符:
Java bit calculate.png


识别二维码,关注公众号“夕识”
夕识.jpeg

GL check point

调查点:

  1. 纹理是否压缩

    • 疑问:不同GPU支持的纹理格式不一样,需要对GPU做适配,工作量不小

    志文:壁纸或许可以做一些处理(go-org反编译代码未发现类似处理),理想情况下,可以减7-8M内存占用

  2. Mipmap

    虽然Mipmap包会比原始图像多用掉33%的内存,但它不仅可以提升性能,也会提高图像质量

    ARM Mali GPU Texture Compression Tool可以生成Mipmap

    • 结论:这个功能会更耗内存,适用于游戏场景,org不适用
  3. 纹理参数设置

    基本越慢的函数,视觉质量越高

    参数配置参考链接:https://www.khronos.org/registry/OpenGL-Refpages/es2.0/

  4. RenderScript 3D 渲染

高斯模糊之类的优化

【Note】《构建之法》提要

《软件工程 构建之法》作者邹欣系Windows中国工程师团队首席研发总监 (Link:亚马逊

整本书,极其认真,结构组织的有点像学术论文了。涵盖面比较全,涉及到了现代软件工程的整个流程,从需求的挖掘产生,到中间各个环节地循序渐进,直至最后的交付与维护支持。必然也就导致每个点深入程度相对较有限。

除了项目本身,本书另一个关注重点是项目中的人:项目经理、用户、测试、开发,讲到各种角色各自的职责,相互之间的协作关系、合作方法,最后一章中还有提到职业道德~(感觉有点偏向股东与雇主)

全书更多的是探讨方法论,关于开发、关于敏捷迭代、关于项目管理、关于结对编程、关于测试流程与种类、关于用户体验的获得与改进、关于需求分析与评审、关于软件工程师的成长。当然作者只是提供了一些自己的见解,很多观点并不一定准确,其中也有一些落伍的工具、模型。

更大的意义许是全面地概述一些需要注意的点,真正贯彻落实这些方法需要耗费极大成本。很多观点引人深思。


EverNote链接

XMind文档

导图

构建之法 overview.png

文本
构建之法

1 个人
1.1 2 个人和技术流程
1.1.1 单元测试
1.1.1.1 着眼于基本点;当事人编写;不改变机器状态;快;可重现;覆盖所有代码路径;与产品代码一同维护
1.1.2 效能分析工具
1.1.2.1 抽样、代码注入
1.1.3 个人开发流程
1.1.3.1 计划、开发、记录用时、测试报告、计算工作量、事后总结、提出过程改进计划
1.2 3 软件工程师的成长
1.2.1 大江东去,浪淘尽,千古风流人物
2 团队
2.1 4 两人合作
2.1.1 代码规范、设计规范、复审(驳回,选择性同意,放行)、结对编程、不同阶段的技巧
2.2 5 团队和流程
2.2.1 团队模式、开发流程
2.3 6 敏捷流程
2.3.1 敏捷问题与解法、敏捷团队(自主)、敏捷总结
2.4 7 MSF
2.4.1 MSF基本原则(共享、沟通、为共同目标努力、充分授权和信任、各司其职、敏捷);MSF团队模型
3 产品
3.1 8 需求分析
3.1.1 软件需求(获取引导、分析定义、验证、管理);利益相关者;用户调研(焦点小组、人类学、快速原型、AB测试);竞争性需求分析框架(Need、Approach、Benefit、Competitors、Delivery);功能定位与优先级(必要与辅助、核心与外围);计划与估计;分而治之
3.2 9 项目经理
3.2.1 来历;职责(开发与测试之外的所有);PM与风险管理;能力要求与任务(观察理解快速学习、分析管理、专业、自省)
3.3 10 典型用户和场景
3.4 12 用户体验
3.4.1 要素(第一印象、换位思考、记住用户选择…);设计的步骤与目标;评价标准(快反馈、贴近现实、暴露控制权、一致性与标准化、适合各种用户、帮助修复;提示语帮助)
4 质量
4.1 11 软件设计与实现
4.1.1 分析与设计方法;团队建模和分析方法;日常管理;
4.2 13 软件测试
4.2.1 分类方法(黑白、功能非功能、时机作用分类);测试方法(UnitTest、BuildTest、AcceptanceTest、探索测试、回归测试、场景/集成/系统测试、伙伴测试、效能测试、压力测试、内外部测试、易用性测试)
4.3 14 质量保障
4.3.1 软件质量(程序、工程、如何衡量、成本);质量保障工作(测试角色)
4.4 15 稳定和发布阶段
4.4.1 从完成到发布;渐进发布;发布之后——事后诸葛亮会议(赏罚、总结经验教训)
5 IT
5.1 16 IT行业的创新
5.1.1 争议点(创新与跟随、鼻祖与布道、专家?、技术创新为核心?、成功者更能创新?);时机;招数
5.2 17 人、绩效和职业道德
5.2.1 猪鸡鹦鹉(成员投入程度不一);人;绩效管理;职业道德(与公众利益一致、客户与雇主利益最大化、产出物满足高标准、专业判断、管理软件与开发维护、职业的诚信与声誉、对同事的支持与帮助、自身不断提高)

【Note-PM】《项目管理修炼之道》提要

第18届Jolt生产效率大奖图书
作者是一名著名的管理顾问,擅长高课件产品开发管理,经验极其丰富

XMind文档链接

导图PDF版链接

导图

第一部分:规划与日程

文本

项目管理修炼之道
Johanna Rothman
规划与日程
启动项目
0.KEY——定义项目、项目约束、决定项目关键驱动因素、章程决策
章程决策
远景、需求、目标、成功标准、ROI
规划项目
0.KEY——足以启动的规划、规划模板、制定发布条件
规划模板
意图
记录
发布条件
目标
项目组织
日程总览
人员配备
建议日程
制订项目风险列表
使用生命周期组织项目
0.KEY——理解生命周期、概览、反馈、大规模项目需要组合多种生命周期、管理架构风险、从瀑布中解脱
安排项目日程
0.KEY——注重实效的日程安排、可选择安排技术、用低技术含量工具安排日程
估算工作
0.KEY——实用估算方式、里程碑切分项目、能不做什么?、多项目时的估算、主动安排人们进行多任务、实用波浪式规划、决定迭代的持续时间、“小石子”
估算
对比历史数据
通过Delphi和宽带Delphi估算
何时不应相信团队的话
减掉每个任务的缓冲时间、要得到的是更准确的估算结果
用日期范围进行估计
用自信心估计
用三个日期估计:最佳、可能、墨菲
小石子
任务不清时使用
如何得到“小石子”
为什么使用
识别和避免日程安排游戏
0.KEY——“希望”是我们最重要的策略、拒绝女王、把灰扫到地毯下面、幸福日期、分散注意力、日程等于承诺
团队与节奏
创建出色的项目团队
0.KEY——招募需要的人、形成团队凝聚力、让组织配合你的工作、对必必需的团队规模了如指掌、知道何时应该加入、成为出色的项目经理、知道何时全身而退
凝聚力
好工具让团队有更好的发挥
软件配置管理系统应满足的最低要求
缺陷跟踪系统应满足的最低要求
发展5阶段
让组织配合
以项目经理的方式管理单一职能团队
管理矩阵式项目团队
管理跨职能团队
项目经理
人际交往能力
提升功能性技能
专业领域技能
工具和技术的专业技能
退
不适合的组织、团队、产品
掌控项目
0.KEY——节奏、中途回顾、为需求排序、是时间盒限定需求相关的工作、将迭代限制在4周以下、使用波浪式规划和日程安排、创建跨职能团队、根据项目风险选择生命周期模型、保持合理的工作时间、使用“小石子”、管理干扰、管理缺陷
“小石子“
将计划的粒度细化,能提高规划时项目的估算准确率
保持项目节奏
0.KEY——使用持续集成、自动化冒烟测试、按功能实现而不是按架构、盯着产品、准备重构、通过用例、用户故事、角色和场景定义需求、分离需求与GUI设计、尽可能用低保真度原型
按功能而不是按框架
首先实现具有最高价值的功能
按功能调试、测试
低保真原型
“使用低保真度原型,人们可以更全面地评估要解决的问题。高保真度原型会限制反馈。”
管理会议
0.KEY——取消部分会议、举行必要会议、项目启动会议、发布版本规划会议、进度报告会议、向管理层报告进度、项目团队会议、迭代审查会议、会议疑难问题解答、远程电话会议
取消
不需要你解决问题
多人参加的顺序式进度报告会议
创建并使用项目仪表板
0.KEY——测量有风险、根据项目完成度来衡量进度、为出资人创建项目仪表盘、使用项目气象报告
衡量进度
速度图表跟踪日程安排进度
用迭代内容图跟踪总体进度
用图表展示团队统一采用的实践
非简单项目
管理多地点项目
0.KEY——提问成本、识别项目文化差异、团队间培养信任、团队间使用互补实践、寻找潜在问题、外包时的注意事项
在项目中集成测试
0.KEY——“减少技术债”、小规模测试以降低风险、TDD是集成的最简单方法、使用多种测试、确定成员在测试工作中的角色、开发人员测试人员比率、让测试与开发同步进行、为项目制定测试策略、系统测试策略模板、QA与测试的区别
管理项目群
0.KEY——管理项目群、将多个相关项目组织到一个发布版本中、随时间推移组织多个相关项目、管理项目经理、创建项目仪表盘
结束项目
0.KEY——管理发布早期版本的请求、管理beta版本、项目经理何时知道无法按时发布项目、知道项目走向完成、取消项目
何时知道无法按时发布
避免小偏差
承诺新日期
估算系统测试时间
管理项目组合
0.KEY——构建所有项目的组合、评估项目、决定现在为那个项目提供资金、对组合中的项目进行排序、尽快启动项目、使用产品待办事项列表管理新功能需求
答疑
说服管理层:“切换上下文”是个坏主意
如何对多任务说不

【分享】Project ANR

问题

ActivityThread waitToFinish

SharePreferenceImpl

原因

Project SP操作统一到同一个进程

  • 每次edit都直接apply(初衷— 保证所有数据都生效)

分析及解决

6.0 — 7.x ,6.0占比 >96%,6.0及以前的读操作是阻塞的(阻塞ActivityThread)

SharePreference提交记录:

  • 第一次读操作不加锁(AndroidFramework7.0开始)
  • 合并写(最后一次改动才写)(AndroidFramework8.0开始)
    • 用generation的概念区分最近的一次改动

优化点

  • 少用
  • 消减不必要写操作
  • 存储是分类型的
    • SP是xml文件,真的需要都写到xml文件里吗?
      • 2进制文件写速度快于xml文件

方法

  • 先清理无用SP写(优化了50%)
  • 减少操作
  • 最后才是check架构(动架构有风险,Project此例中有丢config的风险)

结束语

GP后台关于ANR、Crash是基于session统计的

检查ANR、Crash时可以看看源代码,或许Android有主动修正

做应用,不看Framework

做业务,先到Framework里搜,看是否有提示

【Program】性能考量

引:
《编程珠玑(续)》1.1 介绍性能监视工具;用一个计算素数程序的演进过程演示程序性能提升的非凡效果

在平时开发中的处理一些细节时,虽然可能粗糙对待对程序的表现的影响不明显,但类似的解决方案如果积少成多,势必将程序拉入质量低劣之列,不应不引起重视。

从小处说,一些细微的编程习惯是可以培养建立的(如简单的容器初始化指定size、for循环的控制语句中避免重复调用计算…);
以整体来看,修炼算法基本功底、数据结构选用熟识度训练、设计模式思路训练也是必不可少的;
最后效果来看,需要利用一些专用的性能监视、分析工具,改进程序表现;


关注公众号“夕识”,雕刻时光,雕刻思维

【工具-程序专供】IntelliJ-IDEA-Android-Studio-Plugin推介

工欲善其事必先利其器
今天介绍几个plugin工具(奇淫巧技)

(适用平台:IntelliJ IDEA内核的各类IDE)


效果图

ide_tools.png

按图中标示顺序介绍:

####1.Translation
_ 顾名思义是中英翻译,令人意外的是自带英美两种发音(默认快捷键:ALT + 1/3,OSX 不详)_

####2.Background Image Plus
可以对IDE背景进行自定义,可以设置图片质量/明暗等,对内存有一定消耗,小霸王请绕道

####3.CodeGlance
提供一个代码文件的全局概览缩略图,主要可用于快速定位

【Note-程序】变量类型

最近考了部分面试者关于变量访问的一些问题,总结一下


EverNote链接

XMind文档

导图

parameter type overview.png

文本

变量类型

1 static
1.1 随着类的加载而加载
1.2 附注:Java 类操作流程
2 volitale
2.1 从内存中读取(并不能保证原子性)
2.2 使用原则
2.2.1 写入变量不依赖此变量的值(或者只有一个线程修改此变量)
2.2.2 变量的状态不需要与其它变量共同参与不变约束
2.2.3 访问变量不需要加锁
3 Atomic
3.1 原子性变量
3.2 缺点
3.2.1 必须用特定API对变量进行操作
3.2.2 只有有限的几种类型
4 synchronized
4.1 缺点
4.1.1 性能考量
4.2 注意点
4.2.1 尽量减小锁的范围与程度
4.2.2 多锁时保证操作顺序以防死锁
5 concurrent工具包
5.1 CountDownLatch
5.2 ConcurrentHashMap
5.3 CopyOnWriteArrayList/CopyOnWriteArraySet
5.4 ReadWriteLock/ReentrantReadWriteLock
5.5 LinkedBlockingQueue
5.6 CyclicBarrier
5.7 …

枚举enum必知必会

内容大纲

  • 常规范式——替代int保安全
  • 高阶范式——实现单例模式
  • 复杂范式——实现方法
  • Android中的替代方案——IntDef/StringDef
  • 纯 Java中的替代方案——MagicConstant

常规范式

  • 取代int常量,确保类型安全性

可以看到,上例中,直接使用1,2之类的int值编译器是会报错的,因为enum是一种class,不止具有int值这一属性

相较于int值,enum会有类型安全检查,代码会更安全

高阶范式

  • 实现单例模式

这样实现的单例模式,不需要处理线程同步的问题,相较于传统的懒汉-饿汉-doublecheck的优势显而易见

实际上单例模式特别容易导致内存泄露,应该尽量减少使用,用更易用的架构设计模式来避免使用单例模式

复杂范式

  • 添加成员变量

在利用这一属性时,我们可以直接将enum当成一个类来使用,不一样的地方在于,enum的各项是直接给出了实例化的instance,所以带参构造函数需要我直接在定义中给出初始化参数(如上例中的hour)

  • 提供有差异的API

如上图所示,DayType的两个类型,各自实现了free方法,实现了差异化的API,这一属性可以用于策略模式,针对不同的类型,我们的enum可以提供不同的策略算法,满足差异化的需求

  • 实现接口

上面的抽象方法free,也可以抽象成接口形式,让枚举去实现,这一特性在工程中的应用极为有利,这样一来,就与我们的“面向接口编程”对上号了

注意API的访问级别需要升级为public

Android中的替代办法

我们都知道Android的内存非常宝贵,纵使enum有如此多的优点,但我们有时可能只想用它的一个替代int的属性,来增强代码的安全性,有没有其它更轻量的办法的?

答案是有的,@IntDef, @StringDef就能满足这一要求(属于注解范畴),以IntDef为例:

扒一扒IntDef的源码,我们会发现它其实自己也是一个注解,我们上例中应用的是它的value域,还可以利用的有flag域,鉴于flag一般都不会使用,不做过多介绍

Java模块中的替代办法

有的同学可能碰到这样的业务需要:

实际的工程是纯Java的,根本无法使用Android中的注解,这时该怎么办?

好吧,其实是我自己碰到这样的问题了,解决方案其实也很容易找到,查IntDef的设计思路,可以找到它的出处,最后的解决lib是

1
org.intellij.lang.annotations.MagicConstant

可以看到,这一lib是intellij的注解,感谢伟大的程序员们的杰作intellij

与IntDef不一样的地方在于:

  • 需要添加intValues关键字,不可以省略(IntDef中对应的可省略关键字是value)
  • 具体的值可以相同(IntDef中不可以)
  • 值变为String类型时只需要改关键字为 stringValues

get

enum还有一些特性,比如ordinal()取值、初始值从0开始、用EnumSet/EnumMap代替序数

实际也不推荐使用(ordinal取值不确定性强,程序稳定性差,实在要使用可以用成员变量代替)

exampleModuleModel_leak_fix_side_effect_correct_strategy

##

目的

  • 解决因修改exampleModule泄露导致的onUnBind/unbind调用模糊的问题
  • 梳理exampleModule的主题切换流程逻辑

问题

  • 部分类实现了onUnBind/unbind,但具体逻辑并不符合unbind(即完全释放)的预期
  • 有些类实现了onUnBind/unbind,但并不是在销毁时调用(如:切换主题),直接调用会出问题
  • 部分逻辑调用了onUnBind/unbind,但具体的类里却是空实现
  • 有的类同时实现了onUnBind/unbind两者,onUnBind为空/unbind为空

解决方案

在unbind方法中加参数,对解绑动作做出具体的调用级区分,差异化实现逻辑,而不是像之前的方案一样统一都做销毁级别的处理

主题切换流程

  • 入口:ThemeMineList
  • 具体调用栈
    • 流程图:
1
2
3
4
5
6
7
graph TB
A[ThemeMineList] -->|onClick-applyTheme| B(PageAcitvity)
B -->|applyTheme| C[进程间通信ThemeApplyControllerImpl]
C -->|applyTheme| D[ThemeResourceManager]
D -->|startApplyTheme -- applyAll | E[HostThemeCallBack]
E -->|onApplyAll| F[rebind flow]
F -->|Flow| H[callBindRunnable unbind/bind]
  • 具体类名、方法名:
    • ThemeMineList – onClick() – applyTheme()
      • PageAcitvity.applyTheme() – 进程间通信
        • ThemeManagerService$ThemeApplyControllerImpl.applyTheme
          • ThemeResourceManager.startApplyTheme – applyAll
            • exampleModuleModel$HostThemeCallBack.onApplyAll() – rebind – callBindRunnable() – unbind/bind

涉及场景

  1. 点击清理图标动画没有完成时,切换主题
  2. 不保留活动,点击清理图标动画没有完成时进另一个Activity
  3. 改变AlertClockAppWidget的3D模式,原本的exampleModule代码里并没有实现具体onUnBind逻辑
  4. 删除快捷方式/删除桌面Widget
  5. 卸载应用
  6. 不保留活动,反复切换exampleModule至前台/后台

具体内容

onUnBind

调用——

  1. exampleModuleModel——MarketShortcutInfo
  2. DeleteDropTarget——CustomShortcutInfo
  3. AllAppsView——CustomShortcutInfo
  4. DeleteDropTarget——CustomAppWidgetInfo // remove widget from workspace
  5. exampleModule——AlertClockAppWidget// switch alert clock widget
  • destroy — MarketShortcutInfo
  • switchAlertClockWidget — AlertClockAppWidget
  • uninstallApp — CustomShortcutInfo
  • deleteDropTarget — CustomAppWidgetInfo
  • — CleanMemoryShortcutInfo
  • — ThemeShortcutInfo

Powered by KyleCe

Copyright © 2015 - 2019 KyleCe All Rights Reserved.

访客数 : | 访问量 :