简体   繁体   English

PHP多维关联数组性能或Java中的类似代码

[英]PHP multidimentional associative array performance or similar code in Java

I am doing a lot of operations using a below code in PHP. 我正在使用PHP中的以下代码进行大量操作。 The issue is PHP is getting slower and slower as my data gets bigger and bigger. 问题是随着我的数据越来越大,PHP越来越慢。

My solution to fix this is to move the code in Java so it can provide a better performance as it is complied language and I can also multithread or use async functions to do multiple such operations to make it faster. 解决此问题的我的解决方案是移动Java代码,使其成为编译后的语言,从而可以提供更好的性能,并且我还可以使用多线程或使用异步函数执行多个此类操作以使其更快。

What I want to know is how to speed up this kind of operation in PHP or what other data structure should I use to improve the performance of this code. 我想知道的是如何在PHP中加快此类操作的速度,或者应该使用其他哪种数据结构来提高此代码的性能。 And if not PHP how can I do this in Java. 如果不是PHP,我该如何用Java做到这一点。

        foreach ( $dataArr as $direct ) {

            //total dfpimpr for the date-li combi
            if ( isset( $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']]['COUNTER_TOTALIMPR'] ) ) {
                $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']]['COUNTER_TOTALIMPR'] += $direct[0]['DFPIMPR'];
            }else {
                $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']]['COUNTER_TOTALIMPR'] = $direct[0]['DFPIMPR'];
            }

            $dfpAdUnit = $direct['AD1']['DFPAD1'].'/'.$direct['AD2']['DFPAD2'];
            // can go on the first level of the array as not dependent on AD1/AD2-COUNTRY
            if ( isset( self::$orderLineitemSetting[$direct['DOX']['ORDID']][$direct['DLI']['LIID']]['setting']['is_direct'] ) ) {
                $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['ISDIRECT'] = self::$orderLineitemSetting[$direct['DOX']['ORDID']][$direct['DLI']['LIID']]['setting']['is_direct'];
            }else {
                $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['ISDIRECT'] = 1;
            }

            if ( isset( self::$orderLineitemSetting[$direct['DOX']['ORDID']][$direct['DLI']['LIID']]['setting']['is_ron'] ) ) {
                $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['ISRON'] = self::$orderLineitemSetting[$direct['DOX']['ORDID']][$direct['DLI']['LIID']]['setting']['is_ron'];
            }else {
                $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['ISRON'] = 0;
            }

            $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['DATE'] = $direct['DS']['DATE'];
            $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['ISADEX'] = 0;
            $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['ISMM'] = 0;
            $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['ADVERTISER'] = $direct['DA']['ADVERTISER'];
            $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['ORDID'] = $direct['DOX']['ORDID'];
            $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['ORDNAME'] = $direct['DOX']['ORDNAME'];
            $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['LINAME'] = $direct['DLI']['LINAME'];
            $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['LIID'] = $direct['DLI']['LIID'];
            $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['LISIZE'] = $direct['DSZ']['LISIZE'];
            $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['SITEID'] = $direct['PUBSITE']['SITEID'];
            $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['COUNTRYID'] = $direct['DC']['COUNTRYID'];
            $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['COUNTRY'] = $direct['DC']['COUNTRY'];
            $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['DFPADUNIT'] = $dfpAdUnit;


            //if it is passback (ISDIRECT=2) make its revenue && impr = 0
            //and add its impr to a new pbImpr column
            if ( isset( self::$orderLineitemSetting[$direct['DOX']['ORDID']][$direct['DLI']['LIID']]['setting']['is_direct'] )
                && self::$orderLineitemSetting[$direct['DOX']['ORDID']][$direct['DLI']['LIID']]['setting']['is_direct'] == 2 ) {
                //passback imprs
                $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['PBIMPR'] = $direct[0]['DFPIMPR'];
                //make dfpimpr for passback all 0
                $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['DFPIMPR'] = $direct[0]['DFPIMPR'];
                $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['DFPCLCKS'] = $direct[0]['DFPCLCKS'];
                $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['DFPREV'] = 0;
                //make tpimpr for passback all 0
                $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['TPIMPR'] = 0;
                $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['TPCLCKS'] = 0;
                $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['TPREV'] = 0;
            }else {
                $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['DFPIMPR'] = $direct[0]['DFPIMPR'];
                $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['DFPCLCKS'] = $direct[0]['DFPCLCKS'];
                $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['DFPREV'] = $direct[0]['DFPREV'];
                //include direct data into 3rd party
                $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['TPIMPR'] = $direct[0]['DFPIMPR'];
                $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['TPCLCKS'] = $direct[0]['DFPCLCKS'];
                $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['TPREV'] = $direct[0]['DFPREV'];
            }

            //include direct data into 3rd party
            $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['TP'] = '';
            $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']]['TPTAGID'] = 0;
        }
  1. Follow DRY principle. 遵循DRY原则。 That way you'll reduce the length of the code, its complexity, and - what's most important in this case - you'll get rid of several dozens of multidimensional-arrays dereferences. 这样,您将减少代码的长度,减少代码的复杂性,并且-在这种情况下最重要的是-您将摆脱数十个多维数组取消引用。 Also the final code will be much easier to maintain: 另外,最终代码将更易于维护:

     foreach ($dataArr as $direct) { // create a few references to reduce "ugly" code $counter = &$arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']]['COUNTER_TOTALIMPR']; $directStatus = &self::$orderLineitemSetting[$direct['DOX']['ORDID']][$direct['DLI']['LIID']]['setting']['is_direct']; $ronStatus = &self::$orderLineitemSetting[$direct['DOX']['ORDID']][$direct['DLI']['LIID']]['setting']['is_ron']; $dfpAdUnit = $direct['AD1']['DFPAD1'].'/'.$direct['AD2']['DFPAD2']; if (!isset($counter)) { $counter = 0; } $counter += $direct[0]['DFPIMPR']; $e = array( 'DATE' => $direct['DS']['DATE'], 'ISADEX' => 0, 'ISMM' => 0, 'ADVERTISER' => $direct['DA']['ADVERTISER'], 'ORDID' => $direct['DOX']['ORDID'], 'ORDNAME' => $direct['DOX']['ORDNAME'], 'LINAME' => $direct['DLI']['LINAME'], 'LIID' => $direct['DLI']['LIID'], 'LISIZE' => $direct['DSZ']['LISIZE'], 'SITEID' => $direct['PUBSITE']['SITEID'], 'COUNTRYID' => $direct['DC']['COUNTRYID'], 'COUNTRY' => $direct['DC']['COUNTRY'], 'DFPADUNIT' => $dfpAdUnit, 'TP' => '', 'TPTAGID' => 0 ); $e['ISDIRECT'] = !isset($directStatus) ? 1 : $directStatus; $e['ISRON'] = !isset($ronStatus) ? 0 : $ronStatus; if (isset($directStatus) && $directStatus === 2) { // Hint: don't use magic numbers (2), // create some constant with appropriate name $e += array( 'PBIMPR' => $direct[0]['DFPIMPR'], 'DFPIMPR' => $direct[0]['DFPIMPR'], 'DFPCLCKS' => $direct[0]['DFPCLCKS'], 'DFPREV' => 0, 'TPIMPR' => 0, 'TPCLCKS' => 0, 'TPREV' => 0 ); } else { $e += array( 'DFPIMPR' => $direct[0]['DFPIMPR'], 'DFPCLCKS' => $direct[0]['DFPCLCKS'], 'DFPREV' => $direct[0]['DFPREV'], 'TPIMPR' => $direct[0]['DFPIMPR'], 'TPCLCKS' => $direct[0]['DFPCLCKS'], 'TPREV' => $direct[0]['DFPREV'] ); } $arrayToBeFilled[$direct['DS']['DATE']][$direct['DLI']['LIID']][$dfpAdUnit][$direct['DC']['COUNTRYID']] = $e; } 
  2. Optimize PHP itself. 优化PHP本身。 Use OP code accelerator like APC (for PHP < 5.5) or even better: a JIT compiler ( HHVM ) as suggested by @Alasdair 使用OP代码加速器,如APC (对于PHP <5.5)或什至更好:@Alasdair建议使用的JIT编译器( HHVM

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM