Всегда спорят о том, что быстрее, поэтому я решил запустить несколько тестов, используя разные методы.
Выполнение тестов:
- strpos
- preg_match с циклом foreach
- preg_match с регулярным выражением или
- индексированный поиск со строкой для взрыва
- индексированный поиск в виде массива (строка уже взорвана)
Два набора тестов, где выполняются.Один на большом текстовом документе (114 350 слов) и один на небольшом текстовом документе (120 слов).В каждом наборе все тесты были проведены 100 раз, а затем было взято среднее значение.Тесты не игнорировали случай, который сделал бы их все быстрее.Тест, по которому был выполнен поиск по индексу, был предварительно проиндексирован.Я сам написал код для индексации, и я уверен, что он был менее эффективен, но индексация для большого файла заняла 17,92 секунды, а для маленького файла - 0,001 секунды.НЕ найдены в документе), юридически (найдены в документе) и цели (НЕ найдены в документе).
Результаты в секундах для завершения одного теста, отсортированные по скорости:
Большой файл:
- 0.0000455808639526 (индекс без разнесения)
- 0.0009979915618897 (preg_match с использованием регулярного выражения или)
- 0.0011657214164734 (strpos)
- 0,0023632574081421 (preg_match с использованием цикла foreach)
- 0.0051533532142639 (индекс с разнесением)
Маленький файл
- 0.000003724098205566 (strpos)
- 0,000005958080291748 (preg_match с использованием регулярных выражений или)
- 0,000012607574462891 (preg_match с использованием цикла foreach)
- 0.000021204948425293 (индекс без разнесения)
- 0,000060625076293945 (индекс с разнесением)
Обратите внимание, что strpos быстрее, чем preg_match (с использованием регулярных выражений или), для небольших файлов, но медленнее для больших файлов.Конечно, на это будут влиять и другие факторы, например количество поисковых терминов.
Используемые алгоритмы:
//strpos
$str = file_get_contents('text.txt');
$t = microtime(true);
foreach ($search as $word) if (strpos($str, $word)) break;
$strpos += microtime(true) - $t;
//preg_match
$str = file_get_contents('text.txt');
$t = microtime(true);
foreach ($search as $word) if (preg_match('/' . preg_quote($word) . '/', $str)) break;
$pregmatch += microtime(true) - $t;
//preg_match (regex or)
$str = file_get_contents('text.txt');
$orstr = preg_quote(implode('|', $search));
$t = microtime(true);
if preg_match('/' . $orstr . '/', $str) {};
$pregmatchor += microtime(true) - $t;
//index with explode
$str = file_get_contents('textindex.txt');
$t = microtime(true);
$ar = explode(" ", $str);
foreach ($search as $word) {
$start = 0;
$end = count($ar);
do {
$diff = $end - $start;
$pos = floor($diff / 2) + $start;
$temp = $ar[$pos];
if ($word < $temp) {
$end = $pos;
} elseif ($word > $temp) {
$start = $pos + 1;
} elseif ($temp == $word) {
$found = 'true';
break;
}
} while ($diff > 0);
}
$indexwith += microtime(true) - $t;
//index without explode (already in array)
$str = file_get_contents('textindex.txt');
$found = 'false';
$ar = explode(" ", $str);
$t = microtime(true);
foreach ($search as $word) {
$start = 0;
$end = count($ar);
do {
$diff = $end - $start;
$pos = floor($diff / 2) + $start;
$temp = $ar[$pos];
if ($word < $temp) {
$end = $pos;
} elseif ($word > $temp) {
$start = $pos + 1;
} elseif ($temp == $word) {
$found = 'true';
break;
}
} while ($diff > 0);
}
$indexwithout += microtime(true) - $t;