Я думаю, вопрос, почему вы используете этот сценарий часто? Выполняете ли вы вычисления (замену строк) по тем же данным снова и снова, или вы делаете это по разным данным каждый раз?
Если ответ является первым, то вы не можете сделать больше, чтобы улучшить производительность на стороне PHP. Вы можете повысить производительность другими способами, такими как использование более совершенного оборудования (SSD для более быстрого чтения/записи в файлах), многоядерных процессоров и разбиения данных на более мелкие части, работающие одновременно с несколькими сценариями, для одновременной обработки данных и более быстрой RAM (то есть более высокие скорости шины).
Если ответ является последним, тогда вы можете захотеть кэшировать результат, используя что-то вроде memcached или reddis (хранилища ключей/значений), так что вы можете выполнять вычисление только один раз, а затем это просто линейное чтение из памяти , что очень дешево и практически не требует затрат на процессор (, вы также можете использовать кэш CPU на этом уровне).
Управление строками в PHP уже дешево, потому что строки PHP по существу являются просто байтовыми массивами. Практически нет накладных расходов на PHP при чтении файла в память и хранении его в строке.Если у вас есть пример кода, который демонстрирует, где вы видите проблемы с производительностью, и некоторые номера контрольных точек, я мог бы получить несколько советов, но сейчас кажется, что вам нужен рефакторинг вашего подхода, основанный на ваших базовых потребностях.
Например, затраты на процессор и ввод-вывод рассматриваются отдельно, когда вы имеете дело с данными в разных ситуациях. Ввод/вывод включает блокировку, поскольку это системный вызов. Это означает, что ваш процессор должен дождаться появления большего количества данных по проводу (пока ваш диск передает данные в память), прежде чем он сможет продолжать обрабатывать или вычислять эти данные. Ваш процессор всегда будет намного быстрее, чем память, а память всегда намного быстрее, чем диск.
Вот простой тест, чтобы показать вам разницу:
/* First, let's create a simple test file to benchmark */
file_put_contents('in.txt', str_repeat(implode(" ",range('a','z')),10000));
/* Now let's write two different tests that replace all vowels with asterisks */
// The first test reads the entire file into memory and performs the computation all at once
function test1($filename, $newfile) {
$start = microtime(true);
$data = file_get_contents($filename);
$changes = str_replace(array('a','e','i','o','u'),array('*'),$data);
file_put_contents($newfile,$changes);
return sprintf("%.6f", microtime(true) - $start);
}
// The second test reads only 8KB chunks at a time and performs the computation on each chunk
function test2($filename, $newfile) {
$start = microtime(true);
$fp = fopen($filename,"r");
$changes = '';
while(!feof($fp)) {
$changes .= str_replace(array('a','e','i','o','u'),array('*'),fread($fp, 8192));
}
file_put_contents($newfile, $changes);
return sprintf("%.6f", microtime(true) - $start);
}
Вышеуказанных два теста сделать точно такие же вещи, но Test2 значительно быстрее оказывается для меня, когда я использую меньшие объемы данных (примерно 500 КБ в этом тесте).
Вот тест вы можете запустить ...
// Conduct 100 iterations of each test and average the results
for ($i = 0; $i < 100; $i++) {
$test1[] = test1('in.txt','out.txt');
$test2[] = test2('in.txt','out.txt');
}
echo "Test1 average: ", sprintf("%.6f",array_sum($test1)/count($test1)), "\n",
"Test2 average: ", sprintf("%.6f\n",array_sum($test2)/count($test2));
Для меня выше тест дает Test1 average: 0.440795
и Test2 average: 0.052054
, который является различались на порядок, и это только тестирование на 500 КБ данных. Теперь, если я увеличиваю размер этого файла примерно до 50 МБ Test1 на самом деле оказывается быстрее, так как на итерации меньше вызовов системных операций ввода-вывода (т.е. мы просто читаем из памяти линейно в Test1), но больше Стоимость процессора (т. Е. мы выполняем гораздо более крупные вычисления за итерацию). ЦП обычно оказывается способным обрабатывать гораздо большие объемы данных за раз, чем ваши устройства ввода/вывода могут отправлять по шине.
В большинстве случаев это решение не подходит для всех размеров.
это большой вопрос. +1 от меня. Я вижу, вы используете файлы. Можете ли вы каким-то образом переключиться на базу данных? если нет, мы можем увидеть некоторые данные из файлов? – pregmatch
Как строки считываются и обрабатываются? Вы сравнили замену строк с фактическим открытием файлов или потоков? Платформа? – Daniel
В файлах нет ничего фантастического, это просто вопрос замены символов подчеркивания, удаления запятых, замены символов, отличных от UTF8, и т. Д. И т. Д. –