我的PHP代码包含很多foreach循环,结果绝对是灾难性的。这需要太长时间才能运行。
有替代方案吗?我对所有建议持开放态度。
我在想可能正在实现基于闪存的客户端并使用actionscript来利用客户端的CPU来运行逻辑。
或者有没有办法使用C / C ++来处理服务器本身的计算要求较高的部分并返回PHP结果。
以下函数被调用1,000,000次。
public function performEnrichmentAnalysis($geneSet) {
/**
* $mainArray is a multi dimentional array.
* EntrezID | Set (0/1) | pValue | rank
*/
$mainArray = array();
$finalArray = array();
$originalGenesScore = 0;
$randomGenesScore = 0;
$u = 0;
$EntrezID = array();
$Set = array();
$pValue = array();
$Rank = array();
$originalGenes = $geneSet->getGenes();
$memeberCount = $geneSet->getGeneCount();
$randomGenes = $this->geneExpressionData->getRandomGenes($memeberCount);
/**
* Copy the elements of original and random gene sets to main array.
*/
foreach ($originalGenes as $key => $value) {
$pVal = $this->geneExpressionData->getExpressionValue($value);
$array = array('EntrezID' => $value, 'Set' => 0, 'pValue' => $pVal, 'Rank' => 999);
array_push($mainArray, $array);
unset($array);
}
foreach ($randomGenes as $key => $value) {
$pVal = $this->geneExpressionData->getExpressionValue($value);
$array = array('EntrezID' => $value, 'Set' => 1, 'pValue' => $pVal, 'Rank' => 999);
array_push($mainArray, $array);
unset($array);
}
/**
* sort the multi dimentaional array based on p-values
*/
foreach ($mainArray as $key => $row) {
$EntrezID[$key] = $row['EntrezID'];
$Set[$key] = $row['Set'];
$pValue[$key] = $row['pValue'];
$Rank[$key] = $row['Rank'];
}
array_multisort($pValue, SORT_ASC, $mainArray);
/**
* Assign ranks to the genes
*/
for ($index = 0; $index < count($mainArray); $index++) {
$row = $mainArray[$index];
$row['Rank'] = $index + 1;
$row['Score'] = 0;
//print_r($row['Rank']);
array_push($finalArray, $row);
}
/**
* Calculate scores for each gene
*/
for ($i = 0; $i < count($finalArray); $i++) {
for ($j = $i + 1; $j < count($finalArray); $j++) {
if ($finalArray[$j]['Set'] != $finalArray[$i]['Set']) {
$finalArray[$i]['Score']++;
}
}
}
/**
* Calculate score for the entire set and get universal U and z score.
*/
for ($counter = 0; $counter < count($finalArray); $counter++) {
if ($finalArray[$counter]['Set'] == 0) {
$originalGenesScore += $finalArray[$counter]['Score'];
}
if ($finalArray[$counter]['Set'] == 1) {
$randomGenesScore += $finalArray[$counter]['Score'];
}
}
if ($originalGenesScore > $randomGenesScore) {
$u = $randomGenesScore;
} else {
$u = $originalGenesScore;
}
$zNumerator = $u - (($memeberCount * $memeberCount) / (2));
$zDenominatorSquared = ($memeberCount * $memeberCount * ($memeberCount + $memeberCount + 1)) / 12;
$z = $zNumerator / sqrt($zDenominatorSquared);
if (abs($z) > 2.303) {
$this->temp001++;
} elseif (abs($z) > 1.605) {
$this->temp005++;
} else {
$this->tempRemaining++;
}
}
答案 0 :(得分:2)
嗯,这不是一件容易回答的事情。是的,假设你了解C ++,代码可以用C ++重写。我没有看到任何重大障碍。
您必须想出一种方法来将原始geneSet
添加到C ++代码中,然后构建一个结构来代表您的$mainArray
和其他代码。对阵列使用std::vector
。
由于此代码本身并不实际生成任何webcontent,因此您可以很容易地通过调用服务器上安装的C ++程序来替换该函数。我建议您实际实现在C ++中实现CALLS此功能的功能,因为如果这被称为1M次,那么您最好用C ++进行1M调用,而不是100次调用一段C ++代码。