我有一个Web应用程序,需要SELECT
和INSERT
查询到MySQL数据库,并使用new
运算符在循环内实例化PHP类几千次。可能有我现有逻辑的替代方案,但我的观点是,如果我继续这种逻辑会有什么危害吗?我不打扰目前与算法相关的时间复杂度,但是担心在事务或内存使用期间是否出现任何问题。我正在提供一段代码供参考
$stm_const = "select ce.TIMETAKEN, qm.QMATTER as STRING1, ce.SMATTER as STRING2 from w_clkexam ce, clkmst cm, qsmst qm where ce.QID=qm.QID and cm.ROLLNO=ce.ROLLNO";
for ($c=0; $c < count($rollnos); $c++) {
$stm3 =$stm_const." "."and ce.ROLLNO='$rollnos[$c]'";
$qry3 = mysql_query($stm3) or die("ERROR 3:".mysql_error());
while($row1 = mysql_fetch_array($qry3)) {
echo $string1=$row1['STRING1'];
echo $string2=$row1['STRING2'];
$phpCompareStrings=new PhpCompareStrings($string2, $string1);
$percent=$phpCompareStrings->getSimilarityPercentage();
$percent2=$phpCompareStrings->getDifferencePercentage();
echo '$string1 and $string2 are '.$percent.'% similar and '.$percent2.'% differnt<br/>';
}// end while
}// end for
请帮助,我正在等待你的意见,以便我可以进一步行动。提前致谢。
答案 0 :(得分:0)
我没有看到任何问题。您只需从数据库中获取所有行,并为每行比较字符串。在每次将对象分配给同一个变量时,旧对象在创建新对象之前被销毁。所以你总是在内存中只有一个对象实例。问题是你想对结果做些什么?只能在示例中打印它们,或者存储结果以便进一步处理?
无论如何,我认为在不修改类的情况下优化代码是不可能的。如果您使用this class,则可以尝试修改它以便它可以接受多个字符串。使用此方法,您只能创建该类的一个实例,并且可以避免为每一行销毁/创建对象。它将为您节省一些CPU时间,但不会节省内存(因为在任何时候,只有1个类的实例处于活动状态)。
以下未经测试的修改: 在类中修改此函数:
function __construct($str1,$str2){ $str1=trim($str1); $str2=trim($str2); if($str1==""){ trigger_error("First parameter can not be left blank", E_USER_ERROR); } elseif($str2==""){ trigger_error("Second parameter can not be left blank", E_USER_ERROR); } else{ $this->str1=$str1; $this->str2=$str2; $this->arr1=explode(" ",$str1); $this->arr2=explode(" ",$str2); } }
这两个功能:
function init($str1,$str2){ $str1=trim($str1); $str2=trim($str2); if($str1==""){ trigger_error("First parameter can not be left blank", E_USER_ERROR); } elseif($str2==""){ trigger_error("Second parameter can not be left blank", E_USER_ERROR); } else{ $this->str1=$str1; $this->str2=$str2; $this->arr1=explode(" ",$str1); $this->arr2=explode(" ",$str2); } } function __construct($str1,$str2){ $this->init($str1,$str2); }
然后在循环外创建对象,只在循环内调用$phpCompareStrings->init($string2,$string1)
。