2012-01-29 66 views
0

我有一个Web应用程序,需要SELECTINSERT查询MySQL数据库并使用new运算符实例化PHP类,在循环中使用的运算符几乎是上千次。可能是我现在的逻辑有其他选择,但是我的观点是,如果我继续这个逻辑,会有什么伤害吗?我现在不打扰与算法相关的时间复杂性,但是**很担心在事务或内存使用过程中是否出现任何问题。我给这段代码作为参考在回路内执行MySQL查询并创建多个实例

$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

你有任何代码示例?另外,你有没有想过尝试[单例模式](http://en.wikipedia.org/wiki/Singleton_pattern)? – 2012-01-29 07:49:30

+0

代码示例,是的。辛格尔顿,不! – GordonM 2012-01-29 08:05:41

+0

您是否尝试过使用示例数据对应用程序进行基准测试?你目前是否遇到任何问题? – JohnP 2012-01-29 11:25:33

回答

0

我没有看到任何问题。您只需从数据库获取所有行,并为每一行比较字符串。当您每次将对象分配给同一个变量时,旧对象在新对象创建之前被销毁。所以你在内存中只有一个对象实例。问题是你想对结果做什么?只按照您的示例打印它们,或者将结果存储以供进一步处理?

无论如何,我认为不可能在不修改类的情况下优化代码。如果您使用的是this class,则可以尝试对其进行修改,以便它可以接受多个字符串。使用此方法,您只能创建该类的一个实例,并避免为每一行破坏/创建对象。它会为你节省一些CPU时间,但不是内存(因为在任何时候,只有一个类的实例处于活动状态)。

未测试以下修饰: 修改类内这样的功能:

 
    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); 
     } 
    }

向这些2个功能:

 
    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)在循环内。

+0

谢谢我使用你建议的代码,它工作正常。当你问到最终目标是什么时,我将把结果更新到数据库中供进一步参考。 – Samcoder 2012-02-02 11:11:04