3v4l.org

run code in 300+ PHP versions simultaneously
<?php # Modelo scenario define("DEFAULT_COU", "default"); define("UTILITY", "minimum_utility"); define("TRAFFIC", "traffic_percent"); define("MODEL_SCENARIO_GROUP_CPM", "cpm_sum"); define("MODEL_SCENARIO_CPM", "cpm"); define("MODEL_SCENARIO_UTILITY", "utility"); define("MODEL_SCENARIO_MEMBERS", "members"); echo 'DATA 1'; echo '<br/>'; $prints = 54700; $data = [ 1 => 26.14, 2 => 5.64, 3 => 5.14, 4 => 7.17, 5 => 8.11, 6 => 7.69, 7 => 7.16, ]; $distribucion = Test::getAdsDistributionV2($data, DEFAULT_COU); $printResult = Test::printDistribution($prints, $distribucion); echo '<br/>'; echo 'Distribución de ' . $prints . ' prints'; print("<pre>" . print_r($printResult, true) . "</pre>"); $spendResult = Test::spendDistribution($data, $printResult); echo 'Spend por anuncio'; print("<pre>" . print_r($spendResult, true) . "</pre>"); $spendTotal1 = Test::spendTotal($spendResult); echo 'SPEND TOTAL DATA 1 = ' . $spendTotal1 . '$'; echo '<br/>'; echo '<br/>'; echo 'DATA 2'; echo '<br/>'; $prints = 54700; $data = [ 1 => 26.14, 2 => 5.64, 3 => 5.14, 4 => 7.17, 5 => 8.11, 6 => 7.69, 7 => 7.16, ]; $distribucion = Test::getAdsDistributionV2($data, 'BR'); $printResult = Test::printDistribution($prints, $distribucion); echo '<br/>'; echo 'Distribución de ' . $prints . ' prints'; print("<pre>" . print_r($printResult, true) . "</pre>"); $spendResult = Test::spendDistribution($data, $printResult); echo 'Spend por anuncio'; print("<pre>" . print_r($spendResult, true) . "</pre>"); $spendTotal2 = Test::spendTotal($spendResult); echo 'SPEND TOTAL 2 = ' . $spendTotal2. '$'; echo '<br/>'; echo '<br/>'; echo 'DIFERENCIA = ' . ($spendTotal2 - $spendTotal1).'$'; echo '<br/>'; echo 'PORCENTAJE DE MEJORA= ' . (($spendTotal2*100/$spendTotal1)-100) . '%'; class Test { public static function spendTotal($spendResult) { $total = 0; foreach ($spendResult as $adId => $spend) { $total += $spend; } return $total; } public static function spendDistribution($data, $printResult) { $result = []; foreach ($printResult as $adId => $dist) { $result[$adId] = $printResult[$adId] * $data[$adId] / 1000; } return $result; } public static function printDistribution($prints, $distribution) { $total = 0; foreach ($distribution as $adId => $dist) { $total += $dist; } $result = []; foreach ($distribution as $adId => $dist) { $result[$adId] = $dist / $total * $prints; } return $result; } public static function getAdsDistributionV2(array $ads, $country) { if ($ads) { $dist = Test::getDist($country); $distGroupsCount = count($dist); arsort($ads); // obtener el CPM mayor de los anuncios a distribuir $firstCpm = reset($ads); // si el primer CPM es válido if ($firstCpm > 0) { // inicialmente tenemos una distribución con todos los anuncios a 0 $adDistribution = array_fill_keys(array_keys($ads), 0); $adsNormalization = array(); for ($i = 1; $i <= $distGroupsCount; $i++) { $dist[$i][MODEL_SCENARIO_GROUP_CPM] = 0; } // para cada anuncio vamos a situarlo en el grupo de CPM que le corresponda foreach ($ads as $adId => $cpm) { // normalizamos entre 0 y 1 la utilidad del anuncio, relativas al máximo CPM $adsNormalization[$adId] = array( MODEL_SCENARIO_CPM => $cpm, MODEL_SCENARIO_UTILITY => $cpm / $firstCpm, ); // IMPORTANTE: si algún anuncio tiene CPM = 0, su utilidad será 0 y tiene que caer obligatoriamente // en el último grupo, a menos que se haya indicado en la uración // una utilidad de 0 para el último grupo, // para cada grupo de CPM de la uración del primero al penúltimo for ($i = 1; $i < $distGroupsCount; $i++) { // si la utilidad del anuncio actual es mayor que la del grupo actual if ($adsNormalization[$adId][MODEL_SCENARIO_UTILITY] >= $dist[$i][UTILITY]) { // ubicamos el anuncio en el grupo de CPM $dist[$i][MODEL_SCENARIO_MEMBERS][$adId] = $cpm; // incrementamos el CPM total de anuncios del grupo con el CPM del anuncio actual $dist[$i][MODEL_SCENARIO_GROUP_CPM] += $cpm; } } // si la utilidad del anuncio actual es menor que la del penúltimo grupo, entonces pertenece al último grupo if ($adsNormalization[$adId][MODEL_SCENARIO_UTILITY] < $dist[$distGroupsCount - 1][UTILITY]) { // ubicamos el anuncio en el último grupo de CPM // no es necesario agregar CPMs pporque se distribuirán uniformemente independientemente del CPM que tengan $dist[$distGroupsCount][MODEL_SCENARIO_MEMBERS][$adId] = 1; } } // calculamos todas las frecuencias de anuncios por grupo, del primero al penúltimo // los anuncios que aparezcan en varios grupos, tendrán más peso pues se llevarán tráfico de cada uno de los grupos for ($i = 1; $i < $distGroupsCount; $i++) { // para cada anuncio dentro del grupo if (isset($dist[$i][MODEL_SCENARIO_MEMBERS])) { foreach ($dist[$i][MODEL_SCENARIO_MEMBERS] as $adId => $cpm) { // aumentamos la frecuencia del anuncio actual según su CPM relativo dentro del grupo actual $adDistribution[$adId] += ($dist[$i][TRAFFIC] * $cpm) / $dist[$i][MODEL_SCENARIO_GROUP_CPM]; } } } // tenemos dentro de $adDistribution todos los anuncios de todos los grupos (menos el último) con sus frecuencias relativas // si hay anuncios en el último grupo if (isset($dist[$distGroupsCount][MODEL_SCENARIO_MEMBERS])) { // todos los anuncios del último grupo tienen la misma frecuencia relativa, distribuyendo el tráfico correspondiente $distribution = $dist[$distGroupsCount][TRAFFIC] / count($dist[$distGroupsCount][MODEL_SCENARIO_MEMBERS]); // actualizamos las frecuencias relativas de los anuncios del último grupo foreach ($dist[$distGroupsCount][MODEL_SCENARIO_MEMBERS] as $adId => $cpm) { $adDistribution[$adId] = $distribution; } } // eliminamos todos los elementos que puedan quedar con frecuencia 0 $adDistribution = Test::array_diff($adDistribution, array(0)); // normalizamos la distribución de cada anuncio ganador tomando como base la menor frecuencia $divide = false; foreach ($adDistribution as $adId => $frequency) { if (intval($frequency) == 0) { $divide = true; break; } } if ($divide) { // obtenemos el valor de la menor frecuencia arsort($adDistribution); $lastProbability = end($adDistribution); foreach ($adDistribution as $adId => &$frequency) { $frequency = intval($frequency / $lastProbability); } } else { foreach ($adDistribution as $adId => &$frequency) { $frequency = intval($frequency); } } } else { // @codeCoverageIgnoreStart // todos los anuncios se distribuyen uniformemente $adDistribution = array_fill_keys(array_keys($ads), 1); // @codeCoverageIgnoreEnd } } else { // @codeCoverageIgnoreStart $adDistribution = array(); // @codeCoverageIgnoreEnd } return $adDistribution; } public static function array_diff(array $b, array $a) { $at = array(); foreach ($a as $i) { $at[(string)$i] = 1; } $d = array(); foreach ($b as $k => $i) { if (!isset($at[(string)$i])) { $d[$k] = $i; } } return $d; } public static function getDist($country) { $distributions = array( "BR" => array( 1 => array( UTILITY => 0.9, TRAFFIC => 85, ), 2 => array( UTILITY => 0.55, TRAFFIC => 10, ), 3 => array( UTILITY => 0.45, TRAFFIC => 4, ), 4 => array( UTILITY => 0, TRAFFIC => 1, ), ), DEFAULT_COU => array( 1 => array( UTILITY => 0.70, TRAFFIC => 70, ), 2 => array( UTILITY => 0.55, TRAFFIC => 20, ), 3 => array( UTILITY => 0.45, TRAFFIC => 8, ), 4 => array( UTILITY => 0, TRAFFIC => 2, ), ), ); return $distributions[$country]; } } ?>

Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).

VersionSystem time (s)User time (s)Memory (MiB)
8.3.60.0090.00917.00
8.3.50.0140.00521.99
8.3.40.0130.00318.83
8.3.30.0100.00618.92
8.3.20.0000.00820.47
8.3.10.0030.00523.48
8.3.00.0060.00619.38
8.2.180.0090.00625.92
8.2.170.0110.00722.96
8.2.160.0030.01720.52
8.2.150.0040.00424.18
8.2.140.0090.00024.66
8.2.130.0080.00026.16
8.2.120.0060.00317.63
8.2.110.0120.00022.24
8.2.100.0090.00318.17
8.2.90.0000.00819.47
8.2.80.0040.00417.97
8.2.70.0040.00417.75
8.2.60.0040.00418.05
8.2.50.0080.00018.07
8.2.40.0000.00921.13
8.2.30.0080.00020.79
8.2.20.0030.00517.84
8.2.10.0030.00518.30
8.2.00.0000.00818.13
8.1.280.0060.01025.92
8.1.270.0040.00424.66
8.1.260.0000.00826.35
8.1.250.0070.00428.09
8.1.240.0080.00322.60
8.1.230.0090.00317.77
8.1.220.0040.00417.77
8.1.210.0030.00518.77
8.1.200.0100.00017.38
8.1.190.0080.00017.35
8.1.180.0030.00618.10
8.1.170.0040.00718.71
8.1.160.0000.00822.00
8.1.150.0090.00019.02
8.1.140.0030.00619.65
8.1.130.0050.00317.46
8.1.120.0000.00817.46
8.1.110.0060.00617.48
8.1.100.0040.00417.50
8.1.90.0040.00417.66
8.1.80.0080.00017.55
8.1.70.0050.00217.57
8.1.60.0000.00817.63
8.1.50.0000.00817.58
8.1.40.0090.00017.49
8.1.30.0030.00517.67
8.1.20.0040.00417.80
8.1.10.0040.00417.68
8.1.00.0050.00317.64
8.0.300.0000.00818.77
8.0.290.0070.00016.74
8.0.280.0040.00418.54
8.0.270.0040.00417.31
8.0.260.0030.00317.02
8.0.250.0000.00817.11
8.0.240.0000.00817.15
8.0.230.0070.00017.07
8.0.220.0020.00517.03
8.0.210.0050.00316.96
8.0.200.0070.00017.06
8.0.190.0040.00417.06
8.0.180.0000.00817.05
8.0.170.0060.00317.04
8.0.160.0040.00416.99
8.0.150.0040.00417.07
8.0.140.0000.00717.02
8.0.130.0000.00713.41
8.0.120.0000.00816.89
8.0.110.0000.00817.05
8.0.100.0060.00317.02
8.0.90.0070.00017.04
8.0.80.0110.01117.02
8.0.70.0040.00416.85
8.0.60.0000.00817.13
8.0.50.0040.00416.99
8.0.30.0120.00617.15
8.0.20.0100.00917.44
8.0.10.0000.00817.12
8.0.00.0090.01116.94
7.4.330.0050.00015.08
7.4.320.0030.00316.76
7.4.300.0030.00316.65
7.4.290.0050.00316.64
7.4.280.0080.00016.55
7.4.270.0050.00316.55
7.4.260.0040.00416.73
7.4.250.0000.00716.75
7.4.240.0030.00416.64
7.4.230.0000.00716.77
7.4.220.0110.00916.78
7.4.210.0090.00616.71
7.4.200.0050.00316.82
7.4.160.0080.01316.64
7.4.150.0080.01117.40
7.4.140.0130.01117.86
7.4.130.0080.01616.64
7.4.120.0120.00516.58
7.4.110.0140.01116.91
7.4.100.0110.01416.52
7.4.90.0120.00816.73
7.4.80.0060.01219.39
7.4.70.0160.00616.59
7.4.60.0150.00316.71
7.4.50.0030.00716.34
7.4.40.0030.01316.53
7.4.30.0040.01516.75
7.4.00.0050.01115.07
7.3.330.0060.00013.33
7.3.320.0030.00313.54
7.3.310.0030.00316.41
7.3.300.0080.00016.55
7.3.290.0050.01016.49
7.3.280.0080.01216.51
7.3.270.0140.00717.40
7.3.260.0090.00916.70
7.3.240.0100.01016.61
7.3.230.0130.00416.72
7.3.210.0100.00716.78
7.3.200.0150.00316.65
7.3.190.0100.00716.69
7.3.180.0140.01116.71
7.3.170.0100.00816.76
7.3.160.0100.00716.58
7.3.120.0110.00815.24
7.3.110.0060.01315.17
7.3.100.0100.00715.06
7.3.90.0040.01415.06
7.3.80.0070.00814.97
7.3.70.0050.00914.94
7.3.60.0070.00814.78
7.3.50.0090.00215.01
7.3.40.0080.00314.85
7.3.30.0060.01114.93
7.3.20.0060.00816.51
7.3.10.0080.00516.41
7.3.00.0060.00716.69
7.2.330.0100.01016.82
7.2.320.0070.01716.76
7.2.310.0170.00716.97
7.2.300.0060.01216.86
7.2.290.0170.01016.99
7.2.250.0090.00915.15
7.2.240.0050.01315.21
7.2.230.0070.00515.22
7.2.220.0020.01315.23
7.2.210.0030.01115.27
7.2.200.0030.00715.22
7.2.190.0030.01315.20
7.2.180.0050.00915.21
7.2.170.0050.00915.09
7.2.160.0030.01314.98
7.2.150.0000.01316.92
7.2.140.0100.00316.92
7.2.130.0100.00717.00
7.2.120.0000.01517.04
7.2.110.0070.00716.68
7.2.100.0000.01416.93
7.2.90.0110.00416.85
7.2.80.0060.00617.02
7.2.70.0070.00716.72
7.2.60.0060.00617.03
7.2.50.0000.01017.09
7.2.40.0100.00717.14
7.2.30.0060.00917.03
7.2.20.0050.00516.77
7.2.10.0040.01116.98
7.2.00.0070.00318.20
7.1.330.0020.01215.86
7.1.320.0080.00715.71
7.1.310.0050.01015.92
7.1.300.0080.00615.79
7.1.290.0050.00815.75
7.1.280.0020.01115.78
7.1.270.0070.00615.69
7.1.260.0090.00515.78
7.1.250.0120.00016.00
7.1.200.0070.00715.85
7.1.100.0060.00617.96
7.1.70.0030.00617.13
7.1.60.0190.00619.11
7.1.50.0130.01016.99
7.1.00.0070.07322.57
7.0.200.0170.00716.55
7.0.100.0170.09019.99
7.0.90.0030.08020.02
7.0.80.0270.07020.05
7.0.70.0300.06019.91
7.0.60.0270.08019.98
7.0.50.0000.05020.40
7.0.40.0170.05020.19
7.0.30.0070.07320.08
7.0.20.0270.03720.13
7.0.10.0070.08320.07
7.0.00.0170.05720.16
5.6.280.0030.06321.16
5.6.250.0200.07320.80
5.6.240.0100.08320.54
5.6.230.0070.07320.68
5.6.220.0100.08020.58
5.6.210.0030.05320.55
5.6.200.0200.08021.07
5.6.190.0170.04021.12
5.6.180.0130.08021.13
5.6.170.0130.08720.99
5.6.160.0100.05021.13
5.6.150.0170.07320.99
5.6.140.0030.08320.99
5.6.130.0100.08321.07
5.6.120.0170.05321.07
5.6.110.0070.05321.07
5.6.100.0170.07721.21
5.6.90.0100.08021.08
5.6.80.0100.08720.52
5.6.70.0030.06020.51
5.6.60.0100.05720.38
5.6.50.0100.06320.48
5.6.40.0100.04320.49
5.6.30.0100.06720.48
5.6.20.0100.04720.46
5.6.10.0170.07320.42
5.6.00.0070.06720.41
5.5.380.0170.08020.35
5.5.370.0230.07320.35
5.5.360.0200.04020.44
5.5.350.0000.05320.31
5.5.340.0070.07320.85
5.5.330.0130.08020.93
5.5.320.0000.06020.95
5.5.310.0130.04320.70
5.5.300.0100.06020.88
5.5.290.0100.04720.97
5.5.280.0070.08020.66
5.5.270.0130.07720.91
5.5.260.0100.05720.88
5.5.250.0170.08320.51
5.5.240.0100.04320.33
5.5.230.0130.08020.21
5.5.220.0100.08020.35
5.5.210.0100.05320.26
5.5.200.0070.07720.29
5.5.190.0200.06320.27
5.5.180.0070.07020.16
5.5.160.0200.06320.14
5.5.150.0070.07720.30
5.5.140.0100.08020.26
5.5.130.0030.08320.31
5.5.120.0070.08020.29
5.5.110.0100.04720.29
5.5.100.0070.04720.13
5.5.90.0000.05020.13
5.5.80.0130.06320.21
5.5.70.0100.06320.14
5.5.60.0100.07320.07
5.5.50.0030.08320.11
5.5.40.0000.08720.10
5.5.30.0070.07720.05
5.5.20.0170.07020.14
5.5.10.0130.05020.07
5.5.00.0130.05020.18
5.4.450.0030.04019.20
5.4.440.0030.07719.53
5.4.430.0000.08319.55
5.4.420.0170.04019.20
5.4.410.0070.07719.24
5.4.400.0070.07719.05
5.4.390.0100.07718.95
5.4.380.0100.07719.05
5.4.370.0070.06019.21
5.4.360.0130.06719.04
5.4.350.0000.04718.95
5.4.340.0000.05319.05
5.4.320.0100.07319.14
5.4.310.0100.07718.95
5.4.300.0070.07018.84
5.4.290.0130.04718.90
5.4.280.0000.08319.02
5.4.270.0170.07319.12
5.4.260.0170.07019.04
5.4.250.0000.07318.93
5.4.240.0100.05719.13
5.4.230.0030.07018.89
5.4.220.0070.07719.08
5.4.210.0100.07719.11
5.4.200.0130.07719.06
5.4.190.0100.07019.17
5.4.180.0030.08319.12
5.4.170.0130.07019.02
5.4.160.0030.06019.01
5.4.150.0170.06019.00
5.4.140.0100.03716.39
5.4.130.0070.08016.46
5.4.120.0030.04716.51
5.4.110.0100.06316.33
5.4.100.0070.07716.55
5.4.90.0100.05716.44
5.4.80.0030.04716.38
5.4.70.0100.03316.43
5.4.60.0070.06716.46
5.4.50.0100.06016.47
5.4.40.0030.08016.43
5.4.30.0070.06716.53
5.4.20.0030.04716.52
5.4.10.0070.04016.38
5.4.00.0030.07315.90

preferences:
68.97 ms | 401 KiB | 5 Q