执笔看墨花开💜千千 执笔看墨花开💜千千
首页
  • JavaScript
  • Vue
  • React
  • HTML
  • CSS
  • 算法
  • 工具教程
  • 面试题清单
  • 大前端
  • HTML
  • CSS
  • JS
  • Vue
  • React
  • 零碎
  • 杂言碎语
  • 前端
  • 工具
  • 设计 & CSS
  • 社区 & 平台 & 博客
  • 网站
  • 推荐库
  • 值得一读
  • 分类
  • 标签
  • 归档
  • 心情杂货
  • 友情链接
  • 关于
GitHub (opens new window)

执笔看墨花开

顺其自然
首页
  • JavaScript
  • Vue
  • React
  • HTML
  • CSS
  • 算法
  • 工具教程
  • 面试题清单
  • 大前端
  • HTML
  • CSS
  • JS
  • Vue
  • React
  • 零碎
  • 杂言碎语
  • 前端
  • 工具
  • 设计 & CSS
  • 社区 & 平台 & 博客
  • 网站
  • 推荐库
  • 值得一读
  • 分类
  • 标签
  • 归档
  • 心情杂货
  • 友情链接
  • 关于
GitHub (opens new window)
  • JS文章

    • 识海
    • ES5面向对象
    • ES6面向对象
    • 多种数组去重性能对比
    • JS随机打乱数组
    • 判断是否为移动端浏览器
    • 将一维数组按指定长度转为二维数组
    • 防抖与节流函数
    • JS获取和修改url参数
    • 比typeof运算符更准确的类型判断
    • Commonjs,AMD,CMD和UMD的差异
    • 时间切片
      • 三级目录

    • Vue文章

    • 跨端开发

    • React文章

    • 杂文

    • CSS

    • 前端
    • JS文章
    执笔看墨花开
    2021-08-03

    时间切片

    时间切片的核心思想是:如果任务不能在50毫秒内执行完,那么为了不阻塞主线程,这个任务应该让出主线程的控制权,使浏览器可以处理其他任务。让出控制权意味着停止执行当前任务,让浏览器去执行其他任务,随后再回来继续执行没有执行完的任务。

    所以时间切片的目的是不阻塞主线程,而实现目的的技术手段是将一个长任务拆分成很多个不超过50ms的小任务分散在宏任务队列中执行。

    • 时间切片(Time Slicing) (opens new window)
    • 时间切片编程 timeslice (opens new window)
    • 「前端进阶」高性能渲染十万条数据(时间分片) (opens new window)

    # setTimeout + Generator

    function request() {
      let result = [];
      for (let i = 0; i < 100000; i++) {
        result.push({
          index: i,
          text: ~~(Math.random() * 100000000),
        });
      }
      return Promise.resolve(result);
    }
    
    let ul = document.querySelector("#app");
    
    request().then((res) => {
      function ts(gen) {
        if (typeof gen === "function") gen = gen();
        if (!gen || typeof gen.next !== "function") return;
        return function next() {
          const res = gen.next();
          if (res.done) return;
          requestAnimationFrame(next);
        };
      }
      
      let total = res.length;
      let once = 20;
      let page = total / once;
      let curIndex = 0;
      
      ts(addDom(total))();
      
      function* addDom(curTotal) {
        while (curTotal > 0) {
          let pageCount = Math.min(curTotal, once);
          
          let fragement = document.createDocumentFragment();
          for (let i = 0; i < pageCount; i++) {
            let li = document.createElement("li");
            li.innerText =
              "index: " +
              res[curIndex + i].index +
              "; text: " +
              res[curIndex + i].text;
            fragement.appendChild(li);
          }
          ul.appendChild(fragement);
          curIndex = curIndex + pageCount;
          curTotal = curTotal - pageCount;
          yield;
        }
      }
    })
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    编辑 (opens new window)
    上次更新: 2021/08/04, 18:53:40
    Commonjs,AMD,CMD和UMD的差异
    四级文件(测试)

    ← Commonjs,AMD,CMD和UMD的差异 四级文件(测试)→

    最近更新
    01
    Vue2
    08-26
    02
    JS编程题
    08-26
    03
    前言
    08-26
    更多文章>
    Theme by Vdoing

    © 2021-2021 执笔看墨花开

    粤ICP备2021110554号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式
    ×