2016-08-03 6 views
0

私はこのループの速度を最適化しようとしています。誰がメンバーの何千ものがあるので、速度を高めるために任意のアイデアを持っている場合、私はそれをしたいと思いますし、それが現在PHPのforeachコードのパフォーマンスの速度

SQLストアドプロシージャMembersMobileByVenueはthis-> 例

FirstName Phone  Venue 
Aaron 04******* 7272CD46D51F 
Brad 04******* CF105BB0 
Adam 04******* 7272CD46D51F 
Craig 04******* CF105BB0 

PHPを返す完了するまでに時間の時間がかかります

$venueIDS = isset($_POST['location']) ? $_POST['location'] : array(); 

$msg = $_POST['message']; 
$response = array(); 

if(!empty($venueIDS)){ 
     $Members = GoldCardMembers::MembersMobileByVenue(); 
     foreach($Members as $Member){ 
      if(in_array($Member->Venue, $venueIDS)){ 
       $destination = $Member->Phone; 
       $text = 'Hi ' . $Member->FirstName . ' ' .$msg. '. Reply STOP to opt out'; 
       $ref = 'Members'; 

       $content = '&to='.rawurlencode($destination). 
          '&message='.rawurlencode($text). 
          '&ref='.rawurlencode($ref); 

       $smsbroadcast_response = sendSMS($content); 
       $response_lines = explode("\n", $smsbroadcast_response); 

       foreach($response_lines as $data_line){ 
        $message_data = ""; 
        $message_data = explode(':',$data_line); 
        if($message_data[0] == "OK"){ 
         array_push($response, "The message to ".$message_data[1]." was successful, with reference ".$message_data[2]."\n"); 
        }elseif($message_data[0] == "BAD"){ 
         array_push($response, "The message to ".$message_data[1]." was NOT successful. Reason: ".$message_data[2]."\n"); 
        }elseif($message_data[0] == "ERROR"){ 
         array_push($response, "There was an error with this request. Reason: ".$message_data[1]."\n"); 
        } 
       } 
      } 
     } 
} 

foreach($response as $message){ 
    echo $message; 
} 
+0

そこには複数の 'foreach()'があります。問題を引き起こす可能性のある 'if/elseif/etc'を含めてください。バットから離れて、 'if/elseif/etc'を' switch/case'文に変更することができます。これは、わずかなパフォーマンスの変更のみを提供します。あなたがしなければならないことは真のボトルネックを見つけるためにあなたのスクリプトをデバッグ&プロファイリングすることです。それはいくつかの事のいずれか、つまり:あなたの 'GoldCardMembers :: MembersMobileByVenue()'、 'sendSMS()'、 'if/elseif'、複数の' foreach() '呼び出しです。あなたのデータをチャンクしてそのように処理することをお勧めします。 – Darren

答えて

1
$venueIDS = isset($_POST['location']) ? $_POST['location'] : array(); 

$msg = $_POST['message']; 

$text = ""; 
$destination = ""; 
$content = ""; 
$response_lines = array(); 
$smsbroadcast_response = ""; 
$message_data = array(); 

if(!empty($venueIDS)){ 

     $Members = GoldCardMembers::MembersMobileByVenue(); 
     foreach($Members as $Member){ // O(n) size of $Members 
      if(in_array($Member->Venue, $venueIDS)){ // O(v) size of $venueIDs 

       $destination = rawurlencode($Member->Phone); 
       $text = rawurlencode($Member->FirstName . ' ' .$msg); 

       $content = '&to='. $destination . 
          '&message=Hi ' . $text . '. Reply STOP to opt out'. 
          '&ref=Members'; 

       $smsbroadcast_response = sendSMS($content); 
       $response_lines = explode("\n", $smsbroadcast_response); // O(r) number of "\n" occurances 

       foreach($response_lines as $data_line){ // O(r) 

        $message_data = explode(':',$data_line); // O(d) number of ":" occurances 

        if($message_data[0] == "OK"){ 
         echo "The message to ".$message_data[1]." was successful, with reference ".$message_data[2]."\n"; 
        }elseif($message_data[0] == "BAD"){ 
         echo "The message to ".$message_data[1]." was NOT successful. Reason: ".$message_data[2]."\n"; 
        }elseif($message_data[0] == "ERROR"){ 
         echo "There was an error with this request. Reason: ".$message_data[1]."\n"; 
        } 
       } 
      } 
     } 
} 

ここに私がやったことのリストです:

  • for底からループとechoメインループから直接$messageを除去する代わり
  • 除去$ref
  • 内部それらを宣言するためforループ外$destination$text$content$response_lines$smsbroadcast_response$message_data VARSを初期化VAR各繰り返しのループは最適ではない

これは私が今考えているすべてのことです。さらなる改善のための

注:

私はあなたが使用しているsendSMSの性能に検討したいです。物事を減速させているコンポーネントの1つになる可能性があります。

さらに深く掘り下げるために、パフォーマンスを分析するのに役立つツールはbig Oh notationです。そこで、ループコンポーネントにラベルを付けるコメントを追加しました。

私たちは複数のネストされたループを見ているので、一般的にO(N^3)のようなものがあります。

しかし、我々はその方程式は、このようなより詳細なことを書くことができます:

O(n個の*(V + 2R)* D)

(各変数が表すものを見るためにコードのコメントをご確認ください。 )

"n"(メンバー数)を求めているので、 "v"、 "r"、 "d"などの他の変数を小さくする方法を調べることにします。完全

$message_data = explode(':',$data_line);

を除去するように、これらの変数のいずれかを排除

(すなわちまだ同じ機能を達成する所与)性能上の最高の正の影響を与えます。

関連する問題