JavaScript实现ZLOGO: 性能改进

简介: 基于JavaScript和Antlr4实现简单的中文LOGO语法, 性能改进. Implement simple LOGO language using JavaScript and Antlr4. Improve performance.

主攻前文吴烜:JavaScript实现ZLOGO: 界面改进与速度可调的几个性能问题

在线演示: 圈3

源码仍在: program-in-chinese/quan3
2019_01_23_logo_

之前是在绘制过程中计算每帧需要绘制的线段, 在尝试改进的过程中很快发现问题太多且不易测试. 接着在某早晨"醒悟"到应该而且可以在绘制前计算好每一帧的步进路径表. 不仅可以避免绘制卡顿问题, 还便于测试(因为是纯JS实现, 不需夹杂DOM操作). 于是通过如下递归代码实现了截取指定位置的路径表:

// 返回{截取部分: 路径表, 剩余部分: 路径表}
// 如果 开始位置 >= 终止位置, 返回{[], 所有}
function 截取路径表(路径表, 开始位置, 终止位置) {
  if (开始位置 >= 终止位置) {
    return {截取部分: [], 剩余部分: 路径表};
  }
  if (路径表.length == 0) {
    return {截取部分: [], 剩余部分: []};
  } else if (路径表.length == 1) {
    return 截取路径(路径表[0], 开始位置, 终止位置);
  } else {
    var 段 = 路径表[0];
    var 长度 = 段.长度;
    if (开始位置 >= 长度) {
      路径表.shift();
      return 截取路径表(路径表, 开始位置 - 长度, 终止位置 - 长度);
    } else if (开始位置 < 长度 && 终止位置 < 长度) {
      var 前段 = 截取路径(路径表[0], 开始位置, 终止位置);
      路径表.shift();
      return {截取部分: 前段.截取部分, 剩余部分: 前段.剩余部分.concat(路径表)};
    } else {
      var 前段 = 截取路径(路径表[0], 开始位置, 长度);
      路径表.shift();
      var 后段 = 截取路径表(路径表, 0, 终止位置 - 长度);
      return {截取部分: 前段.截取部分.concat(后段.截取部分), 剩余部分: 后段.剩余部分};
    }
  }
}

原本为去掉路径表第一项, 使用了slice(), 测试时发现耗时接近O(n^3). 导致点击"运行"后的运算耗时在复杂时(比如>10000线段的图形)太长(停顿超过1秒)难以接受. 改为shift()后, 粗测不超过O(n^2), 暂未深入研究.

这里是获取每一帧的路径表(每帧前进的长度等于"速度"):

function 按步进拆分路径表(路径表, 速度) {
  var 所有段 = [];
  while (路径表.length > 0) {
    var 拆分路径 = 截取路径表(路径表, 0, 速度);
    所有段.push(拆分路径.截取部分);
    路径表 = 拆分路径.剩余部分;
  }
  return 所有段;
}

感觉已经达到可以让用户玩玩的程度. 接下来视反馈决定改进方向.

2019-01-23

相关文章
|
3月前
|
数据采集 并行计算 JavaScript
实战指南:在 Node.js 中利用多线程提升性能
在 Node.js 的世界中,多线程技术一直是一个受到广泛关注的领域。最初,Node.js 设计为单线程模式。随着技术发展,Node.js 引入了多线程支持,进而利用多核处理器的强大性能,提升了应用性能。接下来的内容将深入探讨 Node.js 如何实现多线程,以及在何种场合应该采用这种技术。
|
4月前
|
负载均衡 JavaScript 算法
Node.js 多进程的概念、原理、优势以及如何使用多进程来提高应用程序的性能和可伸缩性
Node.js 多进程的概念、原理、优势以及如何使用多进程来提高应用程序的性能和可伸缩性
43 1
|
1天前
|
缓存 JavaScript 前端开发
Vue.js 路由时用于提高应用程序性能
Vue.js 路由时用于提高应用程序性能
|
6天前
|
算法
Swiper库和Glide.js库的性能有何区别
Swiper和Glide.js是两个流行的响应式轮播图库。Swiper功能强大且灵活,支持多方向滑动,拥有丰富的配置和切换效果,适合复杂需求,其高性能得益于优化的算法和惰性加载。Glide.js则轻量级、快速,专注于基础功能,适合简洁需求。两者各有侧重,选择应基于项目具体需求和性能考虑。
|
1月前
|
JavaScript 前端开发
在JavaScript中,如何优化原型链的性能?
在JavaScript中,如何优化原型链的性能?
16 2
|
3月前
|
缓存 JavaScript 前端开发
原生js浪费性能吗?
原生js浪费性能吗?
17 0
|
5月前
|
前端开发 JavaScript UED
JavaScript异步编程:提升性能与用户体验
JavaScript异步编程:提升性能与用户体验
41 1
|
6月前
|
JavaScript 前端开发 网络协议
带你读《现代Javascript高级教程》三十二、Performance API: 提升网页性能的利器(1)
带你读《现代Javascript高级教程》三十二、Performance API: 提升网页性能的利器(1)
|
6月前
|
监控 JavaScript 前端开发
带你读《现代Javascript高级教程》三十二、Performance API: 提升网页性能的利器(2)
带你读《现代Javascript高级教程》三十二、Performance API: 提升网页性能的利器(2)
|
6月前
|
监控 JavaScript 前端开发
带你读《现代Javascript高级教程》三十二、Performance API: 提升网页性能的利器(3)
带你读《现代Javascript高级教程》三十二、Performance API: 提升网页性能的利器(3)