哪个更轻:多边形还是路径?

Hil*_*nes 26 javascript svg

我正在渲染由在笛卡尔平面中对齐的600多个SVG元素组成的地图.我需要它们是单独的元素,因为我希望它们单独响应鼠标事件等.

我的问题是:为了应用很多转换,例如"翻译"(改变他们的位置),例如哪个选项对浏览器"更轻"?

像这个六边形渲染多边形:

<polygon points="43.301270189221924,55 43.301270189221924,65 51.96152422706631,70 60.6217782649107,65 60.6217782649107,55 51.96152422706631,50"></polygon>
Run Code Online (Sandbox Code Playgroud)

...或者将它们创建为像这样的路径:

<path d="M43.301270189221924,55L43.301270189221924,65L51.96152422706631,70L60.6217782649107,65L60.6217782649107,55L51.96152422706631,50Z"></path>
Run Code Online (Sandbox Code Playgroud)

mer*_*tor 34

我怀疑会有多大差异,但是如果有的话,我会期望polygon稍快一些,因为它特别适用于多边形.

事实上,在运行两个分析脚本(见下文)后,我的上述评估似乎是正确的.多边形比所有浏览器中的路径快一点,但差异并不显着.所以我怀疑你真的需要担心这个.幸运的是,polygon无论如何,这听起来都是合乎逻辑的选择.

分析path:

<svg xmlns="http://www.w3.org/2000/svg">
    <g id="paths"></g>

    <text x="20" y="20" id="out"></text>

    <script><![CDATA[
    var d = "M43.301270189221924,55 L43.301270189221924,65 L51.96152422706631,70 L60.6217782649107,65 L60.6217782649107,55 L51.96152422706631,50 Z";

    var paths = document.getElementById('paths');
    var path = document.createElementNS("http://www.w3.org/2000/svg", 'path');
    path.setAttribute('d', d);

    var start = new Date();
    for (var i = 0; i < 20000; i++)
    {
        var el = path.cloneNode(true);
        el.setAttribute('transform', 'translate(' + ((i * 20) % 1000) + ',' + ((i / 50) * 20) + ')');
        paths.appendChild(el);
    }

    setTimeout(function() {
        document.getElementById('out').textContent += 'Path: ' + (new Date() - start) + 'ms';
        // paths.parentNode.removeChild(paths);
    }, 10);

    ]]>
    </script>
</svg>
Run Code Online (Sandbox Code Playgroud)

同样的事情polygon:

<svg xmlns="http://www.w3.org/2000/svg">
    <g id="polygons"></g>

    <text x="20" y="20" id="out"></text>

    <script><![CDATA[
    var points = "43.301270189221924,55 43.301270189221924,65 51.96152422706631,70 60.6217782649107,65 60.6217782649107,55 51.96152422706631,50";

    var polygons = document.getElementById('polygons');
    var polygon = document.createElementNS("http://www.w3.org/2000/svg", 'polygon');
    polygon.setAttribute('points', points);

    var start = new Date();
    for (var i = 0; i < 20000; i++)
    {
        var el = polygon.cloneNode(true);
        el.setAttribute('transform', 'translate(' + ((i * 20) % 1000) + ',' + ((i / 50) * 20) + ')');
        polygons.appendChild(el);
    }

    setTimeout(function(){
        document.getElementById('out').textContent += 'Polygons: ' + (new Date() - start) + 'ms';
        // polygons.parentNode.removeChild(polygons);
    }, 10);

    ]]>
    </script>
</svg>
Run Code Online (Sandbox Code Playgroud)