我正在编写一个HTML5画布可视化。根据Chrome开发者工具分析器,90%的工作是在(program)
完成的,我假设是工作中的V8解释器调用函数和切换上下文等等。
除了逻辑优化(例如,只重绘已更改的可视化部分),我可以做些什么来优化JavaScript的CPU使用率?我愿意为性能牺牲一些可读性和可扩展性。是否有一个很重要的清单,因为我的谷歌技能很糟糕?我有一些想法,但我不确定它们是否值得:
Math.PI / 180
sin
和cos
近似函数代替Math.sin()
和Math.cos()
Math.abs()
替换为~~
更新后关闭:以下是我认为我要问的答案。我想用以下内容添加我自己问题的答案:
答案 0 :(得分:1)
衡量您的表现,找出瓶颈,然后应用适当的技巧来帮助您解决特定的瓶颈问题。过早优化是徒劳的,应该不惜一切代价避免。
注意你的DOM - 限制重绘/重排
注意你的递归 - 考虑迭代或记忆
注意你的循环 - 保持小,如果需要,大量撒上setTimeout()
循环:
<强> DOM 强>:
样式属性:
字符串匹配:
indexOf
代替正则表达式匹配。eval是邪恶的:
'eval'方法以及诸如'new Function'之类的相关结构非常浪费。它们有效地要求浏览器创建一个全新的脚本环境(就像创建一个新的网页一样),从当前作用域导入所有变量,执行脚本,收集垃圾,然后将变量导回原始环境。此外,无法缓存代码以进行优化。如果可能的话,应该避免使用eval及其亲属。
只听你需要的内容:
为BeforeEvent
事件添加事件侦听器是最浪费的,因为它会导致触发所有可能的事件,即使它们不需要。通常,这可以是每秒几千个事件。应不惜一切代价避免使用BeforeEvent
,并将其替换为相应的BeforeEvent.eventtype
。重复的侦听器通常可以替换为提供多个侦听器函数功能的单个侦听器。
计时器需要花费太多时间:
因为计时器通常必须以与eval相同的方式评估给定代码,所以最好在evaluate语句中包含尽可能少的代码。而不是在timeout语句中写入所有代码,而是将它放在一个单独的函数中,并从timeout语句中调用该函数。这允许您使用直接函数引用而不是计算字符串。除了消除eval的低效率之外,这还有助于防止在评估的代码中创建全局变量。