2011-01-10 69 views
2

這個問題涉及到以前的問題在這裏:性能OOJS超過功能JavaScript編程

Reducing number of calls to the methods of a JavaScript object

如果在分析這兩個代碼片段與螢火蟲:

function ie6PNGFixLoader(scriptURL) { 
    if(arguments.length > 0) { 
     for (var i = 0; i < arguments.length; i++) { 
      $.ajax({// load PNG fix scripts 
       url: arguments[i], 
       cache: true, 
       dataType: 'script' 
      }); 
     } 
    } else { 
     return false; 
    }    
} 

var pngFix = "/Global/ICIS/Scripts/DD_belatedPNG_0.0.8a-min.js";  
var pngList = "/Global/ICIS/Scripts/DD_PNG_listing.js"; 
ie6PNGFixLoader(pngFix, pngList); 

function InjectScriptsAndExecute(url) { 
    this.url = url; 
} 

InjectScriptsAndExecute.prototype.InjectMethod = function() { 
    var inject = $.ajax({ 
         url: this.url, 
         cache: true, 
         dataType: 'script', 
         async: false, // Otherwise you cannot depend on the parse order 
         }); 
    return inject; 
} 
var pngFix = new InjectScriptsAndExecute("/Global/ICIS/Scripts/DD_belatedPNG_0.0.8a-min.js"); 
var pngList = new InjectScriptsAndExecute("/Global/ICIS/Scripts/DD_PNG_listing.js"); 
pngFix.InjectMethod(); 
pngList.InjectMethod(); 

它表明後者的InjectScrip tsAndExecute方法比前者對函數的調用快得多。一位同事問我爲什麼提到性能改進,但我自己無法解釋。

任何有助於更好理解的建議都會得到很好的接受。

+5

您將不得不發佈更多關於性能測量的信息。這些之間的主要區別不在於編碼風格(這幾乎不會產生可衡量的差異),而是ajax操作的不同設置(異步與同步)。 – Pointy 2011-01-10 14:40:56

回答

7

參數是不是Array這是一個Object,它有點像一個數組。

if(arguments.length > 0) { // Slow AND superfluous 
    for (var i = 0; i < arguments.length; i++) { // Even SLOWER 
     arguments[i]; // Holy... 

緩存長度,訪問屬性慢,IE6將不會有任何優化在所有的.length,我甚至懷疑它使用arguments[i]的時候,因爲它不是一個真正的Array是很慢因此可能會進行未優化的財產查詢。

如果你想獲得兩全其美的,通過正常Array,使用普通的for循環,cachelength

function ie6PNGFixLoader(scripts) { 
    for (var i = 0, l = scripts.length; i < l; i++) { 
     $.ajax({// load PNG fix scripts 
      url: scripts[i], 
      cache: true, 
      dataType: 'script' 
     }); 
    }    
} 

ie6PNGFixLoader(["/Global/ICIS/Scripts/DD_belatedPNG_0.0.8a-min.js", 
       "/Global/ICIS/Scripts/DD_PNG_listing.js"]); 

編輯

要清楚,定時循環是沒用的,該請求是異步,你要做的就是定時循環和$.ajax通話有沒有點在這裏優化,尤其是不適用於兩個條目。即使在IE6中,自己執行Ajax調用(即使只調用$.ajax)也會比循環更慢。

+0

http://blogs.sun.com/greimer/entry/best_way_to_code_a – Anders 2011-01-10 15:00:06