编写自己的解析器是否值得为此花费额外的运行时间?

Is writing your own parser worth the extra runtime it causes?

本文关键字:运行时间 自己的 值得 是否      更新时间:2023-09-26

我正在做涉及大量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,压力使用)。我们不能回答你的问题。当然,不为开发时已知的东西进行运行时转换会更快。这种速度差异是否相关取决于许多细节和应用程序的要求,你还没有透露(甚至可能没有认真考虑过),只能通过配置测试来弄清楚。

如果是我,如果我有任何想法,也许我调用这个太多了,它可能会影响性能,我会发现做一点额外的输入(或搜索和替换)会少做很多工作,而不必测试潜在的性能问题。

记住你的解析函数

一个简单的事实是,在一段有限的时间内,您将要处理的实际样式或完整样式字符串的数量可能非常少,并且还可能有相当数量的重复。

所以,当你去解析一个样式表达式时,你可以做一些简单的事情,比如将表达式存储在一个映射中,并检查你之前是否见过它。如果有,返回之前得到的结果。

这将在涉及重用时为您节省大量时间,并且在不涉及重用时可能不会花费您太多时间。