2015-10-12 128 views
-3

儘管我已經回顧了以前的幾篇文章,但我的菜鳥功能對於加速執行以下代碼的解決方案是盲目的。有數百個k,並且每個k有(數萬)個我,nearSum()有一個評估testStr的循環。加速JavaScript運行時間

此代碼很慢並且超時Chrome - 我如何改進執行? 在你問之前,任何代碼的唯一原因是'因爲它正在工作'。 nn的值是全局變量。

Function()… 
resArrLen = resultArray[k].length; 
for (i=0;i<resArrLen;i++) 
{ 
testStr = resultArray[k][i].toString(); 
resultArray[k][i] = testStr + "'" + nearSum(testStr); 
}//end for i 
… 

function nearSum(seqFrag) 
{ 
var i=0; 
var ninj=0; 
var seqFragLen=0; 
var calcVal=0; 
var nn=""; 

//sum values 
seqFragLen = seqFrag.length; 
for (i=0; i+1<seqFragLen; i++) 
{ 
nn = seqFrag.substr(i,2); //gets value 
ninj = eval(nn); 
calcVal = calcVal.valueOf() + ninj.valueOf(); 
} //end for i 

return calcVal.toFixed(2); 

} //end nearSum 
+2

任何數據示例與此?沒有一些數據很難看到任何優化方法。 –

+1

'resultArray'包含什麼,爲什麼將它轉換爲字符串,然後在其中的一部分使用'eval'?除非有一些非常具體的原因需要這樣做,否則效率很低。 – Guffa

+1

作爲一個社區,我們不能對你的帖子做太多的事情。目前還不清楚數據的構成。雖然你提供了一些數據的數量指標,但是一個樣本實際上是需要的。結果是,爲了回答這個問題,每個回答者都必須編寫他們自己的數據集,嘗試將它與您顯示的代碼進行匹配,然後嘗試重現所述的速度問題。這個過程浪費了時間。發帖時請儘量考慮其他用戶,以便他們可以回答。這可以通過一小段示例數據來解決,這些數據顯示了這些代碼如何交互。 –

回答

0

首先,看起來您正在使用'eval'將字符串轉換爲數字。這不是打算如何使用。改用'Number(nn)'或'parseInt(nn)'。

否則,代碼是不完整的,沒有示例數據很難優化。

+0

我的回覆也適用於此處。 –

+0

我明白了......你正在與DNA合作。我可以控制輸入數據,通過使用數字而不是鹼基對字母,可以獲得最大的性能提升,因此您不必將字符串映射到值(這需要「哈希」查找)。換句話說,您需要2位來表示4個字母,4位可以表示字母對,或者0到15之間的值。然後可以將每個值用作數組中的索引以獲取您所需的值求和。 –

+0

在任何情況下,如果您提供測試數據和完整的代碼(或只是您計算的工作子集),我會爲您優化它。 –