Подсчет суммы файла

random07

Новичок
Необходимо найти сумму символов файла, считаю следующим образом:

PHP:
$exec_time2 = microtime(true);
for($i=0;$i<$slen;$i++)$iData+=Ord($str[$i]);
$exec_time2 = microtime(true) - $exec_time2;
На это уходит почти 4 секунды при файле в 4.4 Мб, что очень долго. Как можно ускорить данный процесс?
Была идея использовать что-то наподобии такого:

PHP:
$in=file_get_contents("binary.file");
//$in=str_split('',$in);
$in = array_map(function($n){return ord($n);}, (array)$in);
$Summ=array_sum($in);
Но не работает. Стандартные crc32 и т.д. не катят.
 

Фанат

oncle terrible
Команда форума
Задавая вопрос неочевидной осмысленности посторонним людям, следует избегать императивных заявлений. Свои желания следует подкреплять подробными объяснениями.
Необходимо найти сумму символов файла
зачем?
Стандартные crc32 и т.д. не катят.
почему?
 

random07

Новичок
Есть старая версия программы и есть "умники" которым понравилось считать контрольную сумму таким образом. С меня требуется обеспечить полную совместимость со старым. А так бы я crc32 только рад 0.015 секунд дает:)Считайте, что это воля начальства.Мои пояснения, к сожалению, на них не действуют. Еще была идея длл-ку свою сделать и подключить но "они" тоже сказали, что идея очень плохая.
 

Beavis

Banned
Тогда хотя бы читай файл блоками определенного размера, а то грузить в память сразу весь - не самый лучший вариант
 

random07

Новичок
Фанат, простите, понимаю, что мне здесь никто ничего не должен. Интересует тогда такой вопрос: как-то можно строку перевести быстро в массив чисел(кодов) или можно считать файл побайтово как числовой?

PHP:
$size=filesize("binary.file");
$fileData = fread($filePointer, $size);
echo "size=$size b1=".$fileData[15];
При выводе выводит символ, а не число.

>Тогда хотя бы читай файл блоками определенного размера, а то грузить в память сразу весь - не самый лучший вариант
PHP:
$filePointer = fopen('binary.file', "r"); 
if ($filePointer!=false){
$Summ=0;
while (!feof($filePointer))
{
  $fileData = fread($filePointer, 4096);
  for($i=0;$i<4096;$i++)$Summ+=Ord($fileData[$i]);
}}
Результат немногим больше 4 секунд, что еще дольше.
 

Фанат

oncle terrible
Команда форума
в массив переводить точно ничего не нужно - это будет по определению медленнее
про чтение блоками Beavis ерунду написал. это будет экономить память, но никак не поможет с быстродействием.

в общем, лично мне решение неизвестно.
 

fixxxer

К.О.
Партнер клуба
В любом случае будет медленно, но самое (относительно) быстрое, думаю, через $sum+=array_sum(unpack('C*', fgets($f, BLOCK_SIZE))), BLOCK_SIZE подобрать. А вообще это полнейшая глупость, конечно.
 

Beavis

Banned
про чтение блоками Beavis ерунду написал. это будет экономить память, но никак не поможет с быстродействием.
Фанат, ты в последнее время слеповатый какой-то стал...
Я ничего не писал про быстродействие, т.к. тоже не знаю решения.
Я просто сказал, что не надо загружать сразу весь файл, т.к. это накладывает ограничения на его допустимый размер.
 

random07

Новичок
Спасибо всем за советы. Не хотел никого обидеть, сам видимо что-то недоглядел.Посмотрел старый код, на Делфи этот код отработал за 0.17 с. Т.е. вывод остается такой, что такие вещи лучше писать на компилируемых языках, очень жаль, что не PHP :(
fixxxer, результат 2.45 секунды вышел - гараздо лучше!
 

WMix

герр M:)ller
Партнер клуба
мдя... а можно еще так...
PHP:
cat binary.file | wc -m
или
PHP:
cat binary.file | wc -c
если разговор о байтах...

но тебе нужен дельфи... а лучше турбопаскаль!
 
Сверху