/**
  * @param string                            $format
  * @param EncoderInterface|DecoderInterface $encoder
  * @param int                               $iterations
  * @param mixed                             $data
  *
  * @return self
  */
 public static function create($format, $encoder, $iterations, $data)
 {
     $bench = new self();
     /*Raw****************************************************************************/
     $bench->format = $format;
     list($keysLength, $dataLength) = $bench->measure($data);
     $bench->dataTime = $bench->measureTime($iterations, array($bench, 'measure'), array($data));
     $bench->dataLength = $keysLength + $dataLength;
     /*Encoded************************************************************************/
     $encoded = $encoder->encode($data, $format);
     $bench->encodedLength = strlen($encoded);
     $bench->encodingTime = $bench->measureTime($iterations, array($encoder, 'encode'), array($data, $format));
     $bench->decodingTime = $bench->measureTime($iterations, array($encoder, 'decode'), array($encoded, $format));
     /*GZip***************************************************************************/
     $gzipEncoded = gzencode($encoded);
     $bench->gzipEncodedLength = strlen($gzipEncoded);
     $bench->gzipEncodingTime = $bench->encodingTime + $bench->measureTime($iterations, 'gzencode', array($encoded));
     $bench->gzipDecodingTime = $bench->decodingTime + $bench->measureTime($iterations, 'gzdecode', array($gzipEncoded));
     /*BZip***************************************************************************/
     $bzipEncoded = bzcompress($encoded);
     $bench->bzipEncodedLength = strlen($bzipEncoded);
     $bench->bzipEncodingTime = $bench->encodingTime + $bench->measureTime($iterations, 'bzcompress', array($encoded));
     $bench->bzipDecodingTime = $bench->decodingTime + $bench->measureTime($iterations, 'bzdecompress', array($bzipEncoded));
     return $bench;
 }