• DONATE to NULLED!
    Форуму и его команде можно помочь, мотивировать модераторов разделов.
    Помогите модератору этого раздела killoff лично.

Помощь как сделать простой парсер

Уверен на 99%, что нагрузка и скорость у этого варианта лучше, чем вышеописанного...
А что касательно скорости, то вот, пожалуйста, проверь)
PHP:
<?php
$start = microtime(true);
require 'simple_html_dom.php';
$html = file_get_html('content.txt');
$oldTeamNames = array('Bayern Munchen');
$newTeamNames = array('Бавария');
echo '<table>';
foreach($html->find('div.table div.row') as $v) {
    if($v->find('div.cell', 0)->plaintext == '#') {
        continue;
    }
    echo '<tr>';
    echo '<td>' . $v->find('div.cell', 0)->plaintext . '</td>';
    echo '<td>' . str_replace($oldTeamNames,$newTeamNames,$v->find('div.cell', 1)->plaintext) . '</td>';
    echo '<td>' . $v->find('div.cell', 2)->plaintext . '</td>';
    echo '<td>' . $v->find('div.cell', 3)->plaintext . '</td>';
    echo '</tr>';
}
echo '</table>';
print_r($articles);
$time = microtime(true) - $start;
printf("<hr>Скрипт выполнялся %.4F сек.", $time);
PHP:
<?php
$start = microtime(true);
require 'simple_html_dom.php';
$html = file_get_html('content.txt');
$array = array(
    'Bayern Munchen' => 'Бавария',
);
echo '<table>';
foreach($html->find('div.table div.row') as $v) {
    if($v->find('div.cell', 0)->plaintext == '#') {
        continue;
    }
    $name = $v->find('div.cell', 1)->plaintext;
    echo '<tr>';
    echo '<td>' . $v->find('div.cell', 0)->plaintext . '</td>';
    echo '<td>' . $array[$name] != '' ? $array[$name] : $name . '</td>';
    echo '<td>' . $v->find('div.cell', 2)->plaintext . '</td>';
    echo '<td>' . $v->find('div.cell', 3)->plaintext . '</td>';
    echo '</tr>';
}
echo '</table>';
print_r($articles);
$time = microtime(true) - $start;
printf("<hr>Скрипт выполнялся %.4F сек.", $time);
В content.txt лежит содержимое страницы, что автор писал.

Ты не учитываешь тот факт, что парсится содержимое страницы в память. Скорость работы RAM знаешь или в википедию отправить? ;)
 
Честно, проверять лень...

Скорость работы рамы я в курсе... А теперь, прости, объясни мне разницу в коде... Ты хочешь сказать мой вариант на харде чтоль работает? Причём тут вообще рама? Обе обработки в ней проводятся...
 
Хм... Сделал другой тест:
PHP:
<?php

$start = microtime(true);
$time = microtime(true) - $start;
printf("<hr>Скрипт выполнялся %.4F сек.", $time);

$start = microtime(true);
$i = 0;
while ($i < 100000) {
    $i++;
}
$time = microtime(true) - $start;
printf("<hr>Скрипт выполнялся %.4F сек.", $time);

$start = microtime(true);
$i = 0;
$oldTeamNames = array('Bayern Munchen');
$newTeamNames = array('Бавария');
while ($i < 100000) {
    $text = 'Bayern Munchen';
    str_replace($oldTeamNames,$newTeamNames,$text);
    $i++;
}
$time = microtime(true) - $start;
printf("<hr>Скрипт выполнялся %.4F сек.", $time);

$start = microtime(true);
$i = 0;
$array = array('Bayern Munchen');
while ($i < 100000) {
    $text = 'Bayern Munchen';
    $array[$text] != '' ? $array[$text] : $text;
    $i++;
}
$time = microtime(true) - $start;
printf("<hr>Скрипт выполнялся %.4F сек.", $time);

?>

Действительно на PHP 7 примерно в 4 раза твой код быстрее... Странно... Мой шаблон разрушен ))))
Вынужден извиниться, что был не прав.
 
Честно, проверять лень...

Скорость работы рамы я в курсе... А теперь, прости, объясни мне разницу в коде... Ты хочешь сказать мой вариант на харде чтоль работает? Причём тут вообще рама? Обе обработки в ней проводятся...
Разницу в коде смотри с 5 строки. В одном случае осуществляется замена текста функцией str_replace, а в другом вывод значения из массива, если соответствующий индекс там присутствует.

В том то и дело, что работают оба в памяти и нет разницы по времени вообще никакой. Единственное, я вместо if else использовал тернарный оператор, но можешь и без него проверить для большей наглядности.

А теперь посмотри что писал ты выше, что я и цитировал, когда код приложил.
 
А хотя нет! Я был прав!
PHP:
$start = microtime(true);
$i = 0;
$array = array('Bayern Munchen');
while ($i < 100000) {
    $text = 'Bayern Munchen';
    if (!empty($array[$text])) $array[$text];
    else $text;
    $i++;
}
$time = microtime(true) - $start;
printf("<hr>Скрипт выполнялся %.4F сек.", $time);
В среднем в 2 раза быстрее твоего и в 10 раз быстрее, чем сокращённая запись if-else...

И да, я понимаю, что речь идёт о 0,01 с на 100 000 итераций... Но если везде во всём ДЛЕ (порядка 2 Мб кода) пренебрегать 0.01 на каждые 10 строчек - мы получим несколько секунд упущенного времени...

P.s. И дело таки не в else-if, а в разнице empty и !=... Первая в 10 раз быстрее.
 
Последнее редактирование:
А хотя нет! Я был прав!
PHP:
$start = microtime(true);
$i = 0;
$array = array('Bayern Munchen');
while ($i < 100000) {
    $text = 'Bayern Munchen';
    if (!empty($array[$text])) $array[$text];
    else $text;
    $i++;
}
$time = microtime(true) - $start;
printf("<hr>Скрипт выполнялся %.4F сек.", $time);
В среднем в 2 раза быстрее твоего и в 10 раз быстрее, чем сокращённая запись if-else...

И да, я понимаю, что речь идёт о 0,01 с на 100 000 итераций... Но если везде во всём ДЛЕ (порядка 2 Мб кода) пренебрегать 0.01 на каждые 10 строчек - мы получим несколько секунд упущенного времени...

P.s. И дело таки не в else-if, а в разнице empty и !=... Первая в 10 раз быстрее.
Удивительно, но с Для просмотра ссылки Войди или Зарегистрируйся кодом результаты следующие:
Скрипт выполнялся 0.0206 сек.
Скрипт выполнялся 1.0588 сек.
Скрипт выполнялся 2.2534 сек.
В content.txt тоже самое, что и ранее было у меня.
Версия PHP 5.4, шиндоуз.
 
Замени
PHP:
$array[$text] != '' ? $array[$text] : $text;
На:
PHP:
if (!empty($array[$text])) $array[$text];
else $text;
 
PHP:
<?php

echo phpversion();

$start = microtime(true);
$time = microtime(true) - $start;
printf("<hr>Скрипт выполнялся %.4F сек.", $time);

$start = microtime(true);
$i = 0;
while ($i < 100000) {
    $i++;
}
$time = microtime(true) - $start;
printf("<hr>Скрипт выполнялся %.4F сек.", $time);

$start = microtime(true);
$i = 0;
$oldTeamNames = array('Bayern Munchen');
$newTeamNames = array('Бавария');
while ($i < 100000) {
    $text = 'Bayern Munchen';
    str_replace($oldTeamNames,$newTeamNames,$text);
    $i++;
}
$time = microtime(true) - $start;
printf("<hr>Скрипт выполнялся %.4F сек.", $time);

$start = microtime(true);
$i = 0;
$array = array('Bayern Munchen');
while ($i < 100000) {
    $text = 'Bayern Munchen';
    $array[$text] != '' ? $array[$text] : $text;
    $i++;
}
$time = microtime(true) - $start;
printf("<hr>Скрипт выполнялся %.4F сек.", $time);

$start = microtime(true);
$i = 0;
$array = array('Bayern Munchen');
while ($i < 100000) {
    $text = 'Bayern Munchen';
    if (!empty($array[$text])) $array[$text];
    else $text;
    $i++;
}
$time = microtime(true) - $start;
printf("<hr>Скрипт выполнялся %.4F сек.", $time);

?>

5.3.29
Скрипт выполнялся 0.0000 сек.
Скрипт выполнялся 0.0051 сек.
Скрипт выполнялся 0.1204 сек.
Скрипт выполнялся 0.1094 сек.
Скрипт выполнялся 0.0214 сек.

5.4.45
Скрипт выполнялся 0.0000 сек.
Скрипт выполнялся 0.0037 сек.
Скрипт выполнялся 0.0998 сек.
Скрипт выполнялся 0.0937 сек.
Скрипт выполнялся 0.0147 сек.

5.5.35
Скрипт выполнялся 0.0000 сек.
Скрипт выполнялся 0.0040 сек.
Скрипт выполнялся 0.0987 сек.
Скрипт выполнялся 0.0862 сек.
Скрипт выполнялся 0.0141 сек.

5.6.21
Скрипт выполнялся 0.0000 сек.
Скрипт выполнялся 0.0038 сек.
Скрипт выполнялся 0.1068 сек.
Скрипт выполнялся 0.0908 сек.
Скрипт выполнялся 0.0159 сек.

7.0.6
Скрипт выполнялся 0.0000 сек.
Скрипт выполнялся 0.0025 сек.
Скрипт выполнялся 0.0223 сек.
Скрипт выполнялся 0.1079 сек.
Скрипт выполнялся 0.0120 сек.

Что я делаю не так? ))) Windows 10, сборка AMPPS 3.5
 
@Горбушка, я же код немного поменял. Вынес $text вверх, не стал в цикле его переопределять. И поместил в него содержимое content.txt, в котором содержимое страницы, что автор присылал. Почему то при большем количестве данных в памяти на разных версиях PHP скрипт отрабатывает по-разному.
Было бы славно, если бы ты тоже с тем примером проверил на разных версиях, у меня только 5.4 и 5.3 стоят.
 
Назад
Сверху