3v4l.org

run code in 300+ PHP versions simultaneously
<?php namespace JoshDiFabio; interface RomanNumeralGeneratorInterface { /** * @param int $number * @return string * @throws \InvalidArgumentException Argument not an integer or out of range * @author Josh Di Fabio <joshdifabio@hotmail.com> */ public function generate($number); } class RomanNumeral { const ONE = 'I'; const FIVE = 'V'; const TEN = 'X'; const FIFTY = 'L'; const ONE_HUNDRED = 'C'; const FIVE_HUNDRED = 'D'; const ONE_THOUSAND = 'M'; } class RomanNumeralGenerator implements RomanNumeralGeneratorInterface { /** * @var array * @author Josh Di Fabio <joshdifabio@hotmail.com> */ private $_integerNumeralMap = array( 1000 => RomanNumeral::ONE_THOUSAND, 500 => RomanNumeral::FIVE_HUNDRED, 100 => RomanNumeral::ONE_HUNDRED, 50 => RomanNumeral::FIFTY, 10 => RomanNumeral::TEN, 5 => RomanNumeral::FIVE, 1 => RomanNumeral::ONE, ); /** * @param int $number * @return string * @throws \InvalidArgumentException Argument not an integer or out of range * @author Josh Di Fabio <joshdifabio@hotmail.com> */ public function generate($number) { if (!is_integer($number)) { throw new \InvalidArgumentException('Provided argument is not an integer.'); } if (1 > $number || 3999 < $number) { throw new \InvalidArgumentException( 'The provided number is not within the allowed range of 1 to 3999.'); } $numerals = array(); while (0 < $number) { $_prevInteger = null; foreach ($this->_integerNumeralMap as $_integer => $_numeral) { if (!is_null($_prevInteger) && $number >= 4 * $_integer) { $numerals[] = $_numeral; $numerals[] = $this->_integerNumeralMap[$_prevInteger]; $number -= 4 * $_integer; break;<?php namespace JoshDiFabio; interface RomanNumeralGeneratorInterface { /** * @param int $number * @return string * @throws \InvalidArgumentException Argument not an integer or out of range * @author Josh Di Fabio <joshdifabio@hotmail.com> */ public function generate($number); } class RomanNumeral { const ONE = 'I'; const FIVE = 'V'; const TEN = 'X'; const FIFTY = 'L'; const ONE_HUNDRED = 'C'; const FIVE_HUNDRED = 'D'; const ONE_THOUSAND = 'M'; } class RomanNumeralGenerator implements RomanNumeralGeneratorInterface { /** * @var array * @author Josh Di Fabio <joshdifabio@hotmail.com> */ private $_numerals = array( array( 'integer' => 1000, 'symbol' => RomanNumeral::ONE_THOUSAND, ), array( 'integer' => 500, 'symbol' => RomanNumeral::FIVE_HUNDRED, ), array( 'integer' => 100, 'symbol' => RomanNumeral::ONE_HUNDRED, ), array( 'integer' => 50, 'symbol' => RomanNumeral::FIFTY, ), array( 'integer' => 10, 'symbol' => RomanNumeral::TEN, ), array( 'integer' => 5, 'symbol' => RomanNumeral::FIVE, ), array( 'integer' => 1, 'symbol' => RomanNumeral::ONE, ), ); /** * @param int $number * @return string * @throws \InvalidArgumentException Argument not an integer or out of range * @author Josh Di Fabio <joshdifabio@hotmail.com> */ public function generate($number) { if (!is_integer($number)) { throw new \InvalidArgumentException('Provided argument is not an integer.'); } if (1 > $number || 3999 < $number) { throw new \InvalidArgumentException( 'The provided number is not within the allowed range of 1 to 3999.'); } $numerals = array(); while (0 < $number) { // loop through numerals from largest to smallest foreach ($this->_numerals as $_numeralIdx => &$_numeralData) { /* * if the input number less any already selected numerals is larger than the current * numeral, choose the current numeral and deduct its integer value from the input * number */ if ($number >= $_numeralData['integer']) { $numerals[] = $_numeralData['symbol']; $number -= $_numeralData['integer']; break; } $_lesserNumeralData = $this->_numerals[1 + $_numeralIdx]; if ($number >= $_numeralData['integer'] - $_lesserNumeralData['integer']) { $numerals[] = $_lesserNumeralData['symbol']; $numerals[] = $_numeralData['symbol']; break; } } } return implode('', $numerals); } } $generator = new RomanNumeralGenerator; echo $generator->generate(312); } if ($number >= $_integer) { $numerals[] = $_numeral; $number -= $_integer; break; } $_prevInteger = $_integer; } } return implode('', $numerals); } } $generator = new RomanNumeralGenerator; echo $generator->generate(3999);

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)
5.4.190.0100.04412.41
5.4.180.0120.04612.41
5.4.170.0150.04112.42
5.4.160.0110.03812.42
5.4.150.0120.03812.41
5.4.140.0100.04312.10
5.4.130.0110.03812.08
5.4.120.0100.03912.05
5.4.110.0100.03712.05
5.4.100.0060.04112.04
5.4.90.0070.04212.04
5.4.80.0100.04012.05
5.4.70.0080.04012.04
5.4.60.0110.03812.04
5.4.50.0090.04112.04
5.4.40.0080.04112.03
5.4.30.0070.04212.02
5.4.20.0090.04012.02
5.4.10.0120.03912.03
5.4.00.0120.04011.52
5.3.270.0110.04512.72
5.3.260.0110.04612.72
5.3.250.0110.04212.72
5.3.240.0120.04112.72
5.3.230.0100.04612.71
5.3.220.0090.04512.68
5.3.210.0100.04212.68
5.3.200.0110.04112.68
5.3.190.0100.04412.67
5.3.180.0090.04512.67
5.3.170.0130.04112.67
5.3.160.0110.04412.67
5.3.150.0110.04012.67
5.3.140.0100.04012.67
5.3.130.0100.04212.66
5.3.120.0110.04112.66
5.3.110.0100.04212.66
5.3.100.0070.04312.15
5.3.90.0120.04012.13
5.3.80.0130.04012.12
5.3.70.0120.03712.12
5.3.60.0090.03912.10
5.3.50.0100.03912.05
5.3.40.0100.03912.05
5.3.30.0100.03612.01
5.3.20.0100.03711.79
5.3.10.0110.03811.76
5.3.00.0110.04211.74

preferences:
141.68 ms | 1394 KiB | 7 Q