Эта процедура возвращает 0, если CRC из 30 первых байтов равен значению crc (EBU) в последних двух байтах. На моем сервере сценарий немного медленный, поэтому я хочу знать, можно ли оптимизировать эту процедуру.Возможно оптимизировать скорость PHP CRC-рутин?
Если я намеренно отказываюсь на 86500 строк 32-байтовых данных, моя программа заканчивается через 2.2 секунды, если я не буду комментировать первый возврат. Он заканчивается на 4,4 секунды, если я не буду комментировать Второе возвращение и через 5.8 секунды, если я не буду комментировать Третий возврат. Я думаю, было бы неплохо пропустить распаковку, но все мои попытки сделать это потерпели неудачу.
Сама процедура CRC была найдена в сети. Спасибо, кто это написал!
function crc($datax)
{
//return 1; // First return
global $row;
$data = unpack('C*', $datax); // unpack seems to start with index 1...
//return 1; // Second return
$crc = 0xFFFF;
for ($i = 1; $i < 31; $i++) {
$x = (($crc >> 8)^$data[$i]) & 0xFF;
$x ^= $x >> 4;
$crc = (($crc << 8)^($x << 12)^($x << 5)^$x);
}
//return 1; // Third return
return ((~$crc & 0xFFFF) - $data[31] * 256 - $data[32]);
}
и данные поступают из
$fib = fread($fp, 32);
if (crc16($fib) == 0) {
; // process data...
}
Спасибо!
В чем смысл определения глобальной '$ row'? Вы не используете его вообще –
Вы абсолютно правы, я сам не видел. К сожалению, это не помогло миллисекунде удалить эту линию. – dotswe
Использование предварительного приращения может показаться микро-оптимизацией, но 'for ($ i = 1; $ i <31; ++ $ i)' может сэкономить несколько наносекунд –