当前位置: 首页 > news >正文

用quicker-worker.js轻松跑一个大数据遍历

最近在给公司的grid组件进行性能测试和改善,其中非常重要的一个点就是grid加载100k级别的数据时,竟然出现的状况是,渲染不是问题,初始化的时候遍历数据才是问题。

之所以渲染不是问题,是因为组件采用了特殊的渲染方式,它并没有把所有数据一次性渲染到可视区域中,而是通过滚动条的计算,找出对应应该显示的那些条目,仅仅渲染了部分数据,所以加入的DOM节点就少到可怜,自然快很多。

现在的问题,完全放在了初始化的时候,要对这么大的数据量进行遍历,并且对每一个cell的数据执行format操作,可想而知,在不同的机器上,性能自然受到很大的影响。

我所采用的解决方案,是利用HTML5的新特性web worker来解决。worker的应用场景本来就是在backend进行大规模或持久化计算,用在这里正好。之所以在遍历的时候被卡住,就是因为我们遍历的时候,占用js主线程,导致其他程序无法进行。就算使用Promise优化,也会因为排队造成排队之后的操作被卡住。worker是在主线程之外另外开了一个线程,和主线程完全隔离,因此在内存分配上和进程占用上都不一样,worker线程中的程序执行完全不影响主线程中的执行。因此,将主线程中一个可能需要用到500+ms的计算移到另外一个线程中,主线程程序可以无缝继续执行,通过Promise来接收worker线程返回的数据,做到无缝对接。

下面来看具体实现:

1 获取quicker-worker源码

quicker-worker是我在结合了自己对其他开发者的代码阅读之后撰写的两个函数,站在前人的肩膀上倍感愉悦~

你可以通过 https://github.com/tangshuang... 获取源码。

2 使用run函数

在quicker-worker的readme中我详细阐述了它的使用方法,这里就不具体介绍,为了解决上面的grid的问题,我们使用run函数来实现对grid组件的改造。

在grid组件中,有一个遍历,在遍历过程中,对每一个元素进行format。我们如下进行操作:

// .. 其他初始化
run(`function(data, formatter) {
    data.forEach(function(item) {
        formatter(item)
    })
    return data
}`, [data, formatter])
.then(data => {
    this.set(data)
    // .. 后续操作
})

就是这么简单,没有任何拖泥带水的操作,就像一个promise一样。

使用quicker-worker还可以实现非常漂亮的后台监控,每隔一段时间去查询数据是否变化。

let wk = create(`function(data, compare) {
  return $xhr.get('/api/books').then(function(res) {
    if (compare(data, res)) return res
  })
}`, {
  interval: 60*1000,
  xhr: true,
})
wk.invoke([data, compare]).then(newdata => {
  if (newdata) updateData(newdata)
})

就是这么简单。如果你有什么疑问,可以在github上给我提issue。关注我的博客 www.tangshuang.net 给我留言。

相关文章:

  • HttpClient4.2 Fluent API学习
  • 第二天
  • HCNA
  • AR 与 AI 技术是如何让勇士重回王者的?
  • for循环结构break和continue的用法和区别
  • Java中的关键字
  • JSON.parse()在火狐中的BUG
  • IBM:我们不会放弃XIV存储阵列
  • 客户端数据存储----Cookie From 《高程3》
  • Hadoop2.6下安装Hive
  • Windows 10份额稳步上升 Win7继续下滑
  • 初识Rust语言的所有权概念
  • 《SEO的艺术(原书第2版)》——3.1 SEO从业者所能完成的策略性目标
  • 警告:未来互联网安全动荡
  • 《人民日报》教你如何正确使用路由器
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Android组件 - 收藏集 - 掘金
  • Javascript Math对象和Date对象常用方法详解
  • JDK9: 集成 Jshell 和 Maven 项目.
  • oschina
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Tornado学习笔记(1)
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 记录:CentOS7.2配置LNMP环境记录
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 你不可错过的前端面试题(一)
  • 排序算法学习笔记
  • 小试R空间处理新库sf
  • 一些关于Rust在2019年的思考
  • python最赚钱的4个方向,你最心动的是哪个?
  • 交换综合实验一
  • 说说我为什么看好Spring Cloud Alibaba
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (2)MFC+openGL单文档框架glFrame
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (Note)C++中的继承方式
  • (python)数据结构---字典
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (办公)springboot配置aop处理请求.
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (简单) HDU 2612 Find a way,BFS。
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • .NET大文件上传知识整理
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .net项目IIS、VS 附加进程调试
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [Android] Android ActivityManager
  • [C# WPF] 如何给控件添加边框(Border)?
  • [CDOJ 838]母仪天下 【线段树手速练习 15分钟内敲完算合格】
  • [CUDA手搓]从零开始用C++ CUDA搭建一个卷积神经网络(LeNet),了解神经网络各个层背后算法原理
  • [EFI]Acer Aspire A515-54g电脑 Hackintosh 黑苹果efi引导文件