>  기사  >  웹 프론트엔드  >  코드 성능 향상을 위한 팁 - 1000행 테이블 생성을 example_javascript 팁으로 활용

코드 성능 향상을 위한 팁 - 1000행 테이블 생성을 example_javascript 팁으로 활용

WBOY
WBOY원래의
2016-05-16 19:28:36974검색

微软的开发周期中很重要的一块是调整产品的性能。性能调整也是开发者应当留心的关键部分之一。 经过多年发展,业界对于如何优化Win32程序性能已经有非常多的了解。

现在开发者遇到的问题之一是不太清楚是什么导致DTHML和HTML页面运行快或者慢。当然,有一些很简单的方法——比如不要使用2MB大的图片。我们曾经使用过另外一些有趣的技巧提高了DHTML页面的性能,希望它们能帮助你改善自己的页面性能。

这里我使用了一个建立Table的程序例子。其中用document.createElement()和element.insertBefore()方法创建了1000行(Row)的表(Table)。每行有一列(Cell)。Cell中包含的内容称为"Text"。这段代码能有多糟呢?这么小的程序又能有多大调整余地呢?请看介绍。

一开始我写了一段自认为会很快的程序,我尽量避免一些低级问题----像没有显式定义变量、或者在一个页面中同时使用VBScript和Javascript。程序如下:



<script><br>var tbl, tbody, tr, td, text, i, max;<br>max = 1000;</p> <p>tbl = document.createElement("TABLE");<br>tbl.border = "1";<br>tbody = document.createElement("TBODY");<br>tbl.insertBefore(tbody, null);<br>document.body.insertBefore(tbl, null);<br>for (i=0; i<max; i++) {<BR>tr = document.createElement("TR");<BR>td = document.createElement("TD");<BR>text = document.createTextNode("Text");<BR>td.insertBefore(text, null);<BR>tr.insertBefore(td, null);<BR>tbody.insertBefore(tr, null);<BR>}<BR></script>


在PII233/64MB内存/NT4.0/IE5.0的机器上运行这段程序。页面从本机上装载。从开始装载页面到页面完全安静下来(所有的事件均已经运行,屏幕显示完成)的时间为2328毫秒,这也是本次测试的基线(我称之为Test1)。

这个页面中,一个很耗时的操作是频繁引用全局对象,如“document”、“body”、“window”等。引用所有这些类似的全局变量远比引用一个本地变量代价高昂。

因此我作了第一次改进尝试:缓存(Cache)document.body 到本地变量“theBody”中:

增加了如下代码:

var theBody = document.body;
然后修改这一行:

document.body.insertBefore(tbl, null);
将之改为:

theBody.insertBefore(tbl, null);
View the second sample.

这次修改并没有太大影响到整体时间,它只缩短了3 ms。但它已经表明,如果在循环中也有document.body对象而对其引用做出修改,带来的好处将是可观的。

随后,我缓存了document对象----在我们这个测试中,document对象共被引用了3002次。修改后代码如下:



<script><br>var tbl, tbody, tr, td, text, i, max;<br>max = 1000;<br>var theDoc = document;<br>var theBody = theDoc.body;</p> <p>tbl = theDoc.createElement("TABLE");<br>tbl.border = "1";<br>tbody = theDoc.createElement("TBODY");<br>tbl.insertBefore(tbody, null);<br>theBody.insertBefore(tbl, null);<br>for (i=0; i<max; i++) {<BR>tr = theDoc.createElement("TR");<BR>td = theDoc.createElement("TD");<BR>text = theDoc.createTextNode("Text");<BR>td.insertBefore(text, null);<BR>tr.insertBefore(td, null);<BR>tbody.insertBefore(tr, null);<BR>}<BR></script>


View the third sample.

此次运行时间只有2100ms,节约了大约10%的时间。使用本地变量而不是直接引用document对象平均每次节约了0.4毫秒。

一个常用的优化性能的方法是:当脚本不需要立即运行时,在<SCRIPT>标签中设置“defer”属性。 (立即脚本没有被包含在一个function块中,因此会在加载过程中执行。) 设置“defer”属性后,IE就不必等待该脚本装载和执行完毕。这样页面加载会更快。一般来说,这也表明立即脚本最好放在function块中,并在document或者body对象的onload 句柄中处理该函数。在有一些脚本需要依赖用户操作而执行时----例如点击按钮,或者移动鼠标到某个区域----使用该属性非常有用。但当有一些脚本需要在页面加载过程中或加载完成后执行,使用defer属性得到的好处就不太大。</p> <p>下面是使用了defer属性修改后的代码版本:</p> <p><html><br><body onload="init()"><br><script defer><br>function init() {<br>var tbl, tbody, tr, td, text, i, max;<br>max = 1000;<br>var theDoc = document;<br>var theBody = theDoc.body;</p> <p>tbl = theDoc.createElement("TABLE");<br>tbl.border = "1";<br>tbody = theDoc.createElement("TBODY");<br>tbl.insertBefore(tbody, null) ;<br>theBody.insertBefore(tbl, null);<br>for (i=0; i<max i>tr = theDoc.createElement("TR");<br>td = theDoc. createElement("TD");<br>text = theDoc.createTextNode("Text");<br>td.insertBefore(text, null);<br>tr.insertBefore(td, null);<br>tbody. insertBefore(tr, null);<br>}<br>}<br></script>


네 번째 샘플 보기

이 테스트 시간은 2043ms입니다. 이는 기준 테스트에 비해 12% 증가한 수치이며, 이전 테스트에 비해 2.5% 높은 수치입니다.

아래에서 이야기하는 개선 방법은 매우 유용하지만 물론 조금 더 귀찮습니다. 요소를 생성한 다음 이를 트리형 구조에 삽입해야 하는 경우 먼저 큰 하위 트리에 삽입한 다음 큰 하위 트리를 트렁크에 삽입하는 것보다 트렁크에 직접 삽입하는 것이 더 효율적입니다. 예를 들어, 행당 하나의 열과 열에 일부 텍스트가 있는 테이블을 생성하는 경우 다음을 수행할 수 있습니다.

1. 을 만듭니다.

2. 를 만듭니다.

3. TextNode 노드 생성

4.

에 TextNode를 삽입합니다. 5. 에 를 삽입합니다.

6. TBODY에 을 삽입합니다.

다음 방법보다 속도가 느린 경우:

1. 을 만듭니다.

2. 를 만듭니다.

3. 텍스트 노드 생성

4. TBODY에 을 삽입합니다.

5.

에 를 삽입합니다. 6. 에 TextNode를 삽입합니다.

위의 4가지 테스트는 모두 전자의 방법을 사용했습니다. 다섯 번째 테스트에서는 후자의 방법을 사용했습니다. 코드는 다음과 같습니다.




다섯 번째 샘플 보기

Test5에는 1649ms만 소요됩니다. 이는 지난 테스트에 비해 25% 개선되었으며 기준선보다 거의 30% 빠릅니다.

미리 만들어진 스타일시트를 사용하여 후속 수정이 이루어졌습니다. 미리 만들어진 스타일 시트를 사용하거나

태그를 통해 설정된 테이블의 열 너비는 태그가 없으면 각 열의 너비가 균등하게 분배됩니다. 각 열의 크기 등을 다시 계산할 필요가 없기 때문에 스타일 시트를 사용하면 특히 테이블의 열 수가 많은 경우 실제로 성능이 향상됩니다.

스타일 시트(
CSS
)를 추가하는 코드는 다음과 같이 매우 간단합니다.

tbl.style.tableLayout = "fixed";

6번째 샘플 보기

테스트의 테이블에는 열이 하나뿐이었기 때문에 이 변경으로 인해 페이지 성능은 1.6%만 향상되었습니다. 열이 더 많으면 성능 향상이 더욱 커집니다.

마지막 두 테스트에서는 테이블에 텍스트가 삽입되는 방식이 변경되었습니다. 이전 테스트에서는 먼저 TextNode를 만든 다음 이를 TD에 삽입했습니다. 대신 Test7에서는 innerText를 통해 포함된 텍스트를 지정합니다. 수정된 코드는 다음과 같습니다.

td.innerText = "Text";

7번째 샘플 보기

놀랍게도 이번 수정으로 인한 차이는 엄청납니다. 지난번에 비해 성능이 9% 향상되었고, 원본에 비해 총 36% 성능이 향상되었습니다. 시간 범위는 처음 2323ms부터 마지막 ​​1473ms까지입니다.

이제 거의 모든 사람들이 element.innerHTML을 사용하는 것이 매우 느리다는 것을 알고 있습니다. 얼마나 느린지 확인하기 위해 마지막 테스트를 수행했습니다. innerText 대신 innerHTML을 사용하여 텍스트를 삽입하는 것입니다. 이로 인해 성능이 크게 저하됩니다. 시간은 3375ms에 도달했는데, 이는 지난 테스트보다 80%, 기준 테스트보다 45% 느렸습니다. 분명히 innerHTML은 시간이 많이 소요됩니다.

HTML 페이지 성능 조정은 Win32 애플리케이션 성능 조정과 유사합니다. 무엇이 느리고 빠른지 알아야 합니다. 이러한 방법이 페이지 성능을 향상하는 데 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.