编写自己的解析器是否值得为此花费额外的运行时间?
Is writing your own parser worth the extra runtime it causes?
我正在做涉及大量DOM操作的工作。我写了一个函数,使用"热键"更有效地改变对象的常见样式。它简单地解释如下:
styles = parseStyles({p:"absolute",l:"100px",t:"20px",bg:"#CC0000"});
如下:
styles = {position:"absolute",left:"100px",top:"20px",background:"#CC0000"};
这样做主要是为了让我不必读那么多,而且我想看看我是否能做到:)(以及文件大小)。我发现这些热键更容易看;我为不同的自定义DOM对象设置和重置样式数十次。
但是,如果我的页面在一个会话中使用它多达5000次,一次执行大约10-25次,那么像这样的瓶颈会对性能和运行时造成重大负担吗?
function parseStyles(toParse){
var stylesKey =
{h:"height",p:"position",l:"left",t:"top",r:"right",b:"bottom",bg:"background"},
parsedStyles = {};
for (entry in toParse){
if (entry in stylesKey){
parsedStyles[stylesKey[entry]] = toParse[entry];
} else {
parsedStyles[entry] = toParse[entry];
}
}
return parsedStyles;
}
我发现现在很少需要设置非计算样式了。如果你提前知道样式,在CSS中定义一个类,并从必要的对象中添加class或removeClass。你的代码更容易维护,所有与样式相关的信息都在CSS文件中,而不是Javascript文件中。基本上,我唯一一次直接在对象上设置格式化样式的信息是当我使用绝对定位的计算位置时,即使在这种情况下,如果我绞尽脑汁,定位问题通常可以用纯CSS/HTML来解决。
你在问题中引用的例子看起来像静态样式,可以用CSS规则和简单地对对象做addClass来完成。除了更干净,执行起来也应该快得多。
看起来您正在做的是使用运行时解析来节省开发时的类型。如果您没有注意到性能差异,那么这很好。只有你自己知道这一点,因为只有你才能在你需要运行的环境中测试你的应用(旧浏览器,旧CPU,压力使用)。我们不能回答你的问题。当然,不为开发时已知的东西进行运行时转换会更快。这种速度差异是否相关取决于许多细节和应用程序的要求,你还没有透露(甚至可能没有认真考虑过),只能通过配置测试来弄清楚。
如果是我,如果我有任何想法,也许我调用这个太多了,它可能会影响性能,我会发现做一点额外的输入(或搜索和替换)会少做很多工作,而不必测试潜在的性能问题。
记住你的解析函数
一个简单的事实是,在一段有限的时间内,您将要处理的实际样式或完整样式字符串的数量可能非常少,并且还可能有相当数量的重复。
所以,当你去解析一个样式表达式时,你可以做一些简单的事情,比如将表达式存储在一个映射中,并检查你之前是否见过它。如果有,返回之前得到的结果。
这将在涉及重用时为您节省大量时间,并且在不涉及重用时可能不会花费您太多时间。
- HTML5画布-暂停时的运行时间
- PHP脚本在Lion上通过Ajax运行时会回显自己的内容
- 有没有办法阻止(特定的)恶意脚本在我自己的网页上运行
- 我可以在(加载的)页面上运行我自己的javascript吗
- 如何从上次运行javascript函数的时间开始
- 使用属性获取对象值的运行时间
- 清除运行时在它自己的函数中的超时
- 如何格式化setInterval方法JavaScript的运行时间
- 引用模型的ObjectId有自己的时间戳吗?(Mongoose v3.6.15)
- 我可以在使用JavaScript中的时间函数的iframe中运行脚本吗
- 可汗学院的计算机程序如何离线运行或在我自己的网站上运行
- 在运行时用你自己的url更改href标签
- 在javascript中引用数组的运行时间
- 在编写自己的代码后,Angularjs无法在windows、chrome和firefox中运行
- 监控专用网络网站的正常运行时间
- 这个时间戳是什么格式,以及我如何用它自己的时间来格式化它
- 如何使用我自己的“下一步”按钮和“;previous"相反,按钮在运行时生成
- 在图像元素改变了src之后,计时函数的运行时间
- 编写自己的解析器是否值得为此花费额外的运行时间?
- 如何使用元素检查器在网站上运行我自己的事件处理Javascript代码