优化搜索体验

Satus
Done
Type
Optimizer 👌
Push time
Feb 22, 2022
Pushed
Pushed
交互优化
  • OK - 分段加载,未完成但已有结果时就渲染到列表中
  • 可视化搜索进度
性能优化
  • for 循环提速
    • 不使用函数进行迭代,使用 for
    • 判断 length 时,使用局部变量,避免每次都查一次数组的长度
    • setTimeout 缩减延迟间隔
  • 获取 TEXT 图层的方法进一步缩减每一次的检索范围,让每次搜索任务更细化
JavaScript性能优化--循环优化_zem-CSDN博客_js循环优化
循环是我们在写代码时经常用到的一种结构,而往往在考虑性能优化时,循环的优化能带来很大的收益,特别是当我们不得不循环多次时,如果没对性能进行优化,那毫无疑问会带来性能的负担。 for循环可能是我们最常用的循环,相对于其他种循环来说,for循环将初始化,判断终止条件,判断值的改变明显地写在了括号内,更为直观。 for(var i=0;i<sum;i++){ //... } var i=0; while(i<sum){ // ... i++; } var i=0; do{ // ... i++; }while(i<sum) for-in循环一般用于遍历对象中的key,一般不会使用for-in,因为for-in循环会对性能有更多消耗,会在下文提及原因 for(var prop in object){ // ... } for-of循环也可用于一个有Iterator的对象,如数组,具体可见 ES6学习笔记(六)Iterator接口 ,与for-in不同的是,for-of可以使用break和return语句来跳出循环。然而,虽然其性能消耗比for-in少,但是其性能消耗相对于前三种来说还是更多的,将在下文提及原因 for(var val of arr){ // ... } 在对上面的几种循环遍历数组进行测试后,可以发现for-in循环和for-of循环的速度明显慢于其它三种,对于for-in来说,需要同时遍历实例和原型链,在遍历上的消耗更多,而对于for-of来说,需要去调用Symbol.iterator函数来构建一个迭代器,自动调用next(),且不向next()传入任何值,在接收到done:true之后停止,自然回比前三种方法慢。 (这里的性能测试我使用了console.time()和console.timeEnd()之间的时间差距来比对,因为会受浏览器等各种因素影响,上面的结论是我测试了多组数据后得出的结论) let arr = []; arr.length = 10000; arr.fill(1); (function() { console.time('for循环'); for (var i = 0; i < arr.length; i++) { // ...
JavaScript性能优化--循环优化_zem-CSDN博客_js循环优化
关键字
总时长(有结果 ms)
总时长(无结果 ms)
备注
yes
4947
yes
5552
let len = selection.length
yes
5338
yes
6054
findKeyWord 使用 for 循环,放弃 forEach
5574
5647
button
5506
5371
5547
yes
5874
7088
5459
yes
6019
使用的变量在函数开始前命名好,后续直接调用变量 let node = node_list[i]
6179
5372
5116
5391
取消判断父级状态
5437
5140
7417
5486
5454
重点在 findKeyWord 方法的优化
5472
5060
5202
6214
6141
5709
6060
5723
5934
减少变量
5498
5721
5989
3
11672
推送进度
12049
12124
12957
不推送进度
13868
13510
13510
.find_result_list_info { height: 74%; display: flex; /* justify-content: space-around; */ align-items: center; color: rgba(40, 40, 40, 1); font-size: 12px; flex-direction: column; padding-top: 37%; }
// ui.tsx onSearch = () => { console.log('设置搜索中状态:'); this.setState({ find_loading: true, index:0, search_results_list: [] // 每次搜索清空历史记录 // code.ts findKeyWord node_list.forEach(element => { setTimeout(() => { test_number++ figma.ui.postMessage({ 'type': 'loading','index':test_number,'total':node_list.length });