На страницу Пред. 1, 2 |
|
|
Yabuti писал(а): |
adamant, php, недавно начал изучать
|
Тут ведь вот как... Сам по себе PHP - язык несложный. Тем более, что за основу взят сишный синтаксис. Изучить его за день можно.
Но знать язык и уметь на нем кодить, это не одно и то же. Во-первых, надо просто уметь создавать эффективные алгоритмы (без разницы на каком языке - хоть на русском разговорном). Во-вторых, нужно уметь создавать эффективные алгоритмы с учетом достоинств и недостатков данного конкретного языка. Первое может потребовать долгой учебы и чтения всяких книжек, а второе придет с опытом.
Чисто два примера того, как может выглядеть твой скрипт, если подойти к нему с других сторон.
То же самое, но без итератора foreach:
Код: |
<?php
$clean = 'бесплат';
$source = file ( 'text.txt', FILE_IGNORE_NEW_LINES );
$cnt = 0;
function is_in($var) {
global $clean, $cnt;
echo ++ $cnt . ". Обработали кейворд: <font color=#392E85>$clean</font><br />\n";
return strpos ( $var, $clean ) === false;
}
$result = array_filter ( $source, "is_in" );
file_put_contents ( 'text.txt', implode ( "\n", $result ) );
echo "===========================================<br />\n";
echo "Итого: $cnt кейвордов обработано.\n";
?>
|
Отличается от твоей версии, верно? Тем не менее, даже этот вариант кода не учитывает особенностей конкретного языка. А учитывать их необходимо, ибо только так можно оптимизировать код (сделать его более быстрым и компактным). Например, все необходимые операции можно сделать вообще без единого цикла, или колбэка, уместив все операции всего в одну строку:
Код: |
<?php
$clean = 'бесплат';
file_put_contents ( 'text.txt', preg_replace ( '/^.*?' . preg_quote ( $clean, '/' ) . '.*\n?/m', '', file_get_contents ( 'text.txt' ) ) );
?>
|
Данный код делает абсолютно то же самое, что и твой - только гораздо быстрее, да и по размеру он гораздо меньше
В общем, правильно тут люди сказали. Если хочешь научиться кодить (на PHP, или на чем-то другом - не важно), готовься посвятить этому годы своей жизни. |
|
|
|
|
|
Не нужно стремиться сделать код компактнее, так он труднее читается.
По поводу скорости тоже - вряд ли скрипт, юзающий регулярки, будет быстрее strpos |
|
|
|
|
|
тему подняли ))
я вообще после критики Медара пошел читать его блог.
И теперь php бросил, т.к. плохо его знаю, лучше изучить другой язык, чтобы в голове не было путаницы. Качнул пакет Руби на Рельсах, Аптану, вечерами изучаю, что-то пытаюсь сделать на нем.
Нравится Руби, красивый код и не только под веб.
Медар, спасибо, что не прошел мимо, высказал реальное мнение, у меня открылись глаза |
|
|
|
|
|
medar писал(а): |
Не нужно стремиться сделать код компактнее, так он труднее читается.
По поводу скорости тоже - вряд ли скрипт, юзающий регулярки, будет быстрее strpos
|
На самом деле, тут как бы и говорить не о чем. Во-первых, легче читается короткий код, а не длинный. В случае с простенькой однострочной регуляркой, код становится горзадо более понятным, нежели тот что с циклом, или тот, что с колбэком - тупо потому, что он на много проще и в нем меньше букоф
Кстати, понятность кода и скорость его работы, чаще всего являются взаимоисключающими понятиями. Лично я считаю, что конечному пользователю плевать на читаемость моего кода, для него главное это производительность. Конечно, если речь идет о работе, а не об обучении.
Что же касается скорости работы, ты опять таки сильно заблуждаешься. Регулярка - регулярке рознь. Сложные регулярки работают медленно, зато простые (как в примере выше) - чрезвычайно быстро. Например в данном конкретном случае, однострочный код работает в 2 раза быстрее, чем версия с колбэком и в 18 раз быстрее, чем исходный скрипт с циклом.
Вот результаты бенчмарков, проведенных на моем Core2Duo 2 c 4Gb ОЗУ:
1) Версия с циклом: 18 секунд (все строки вывода промежуточных результатов через echo удалены)
2) Версия с колбэком: 2 секунды (все строки вывода промежуточных результатов через echo удалены)
3) Версия с регуляркой: 1 секунда
Тест проводился на текстовом файле весом 10,335K, содержащим 134408 (т.е. более 134K) строк.
1.
Код: |
$time = time();
$clean = '/78/';
$source = file('text.txt');
$buff = fopen('text.txt','w+');
$i = 1;
foreach($source as $clean)
{
if(strpos($clean,$sample)===false) fwrite($buff,$clean);
$i++;
}
$i--;
fclose($buff);
echo time() - $time;
|
2.
Код: |
$time = time();
$clean = '/78/';
$source = file ( 'text.txt', FILE_IGNORE_NEW_LINES );
$cnt = 0;
function is_in($var) {
global $clean, $cnt;
return strpos ( $var, $clean ) === false;
}
$result = array_filter ( $source, "is_in" );
file_put_contents ( 'text.txt', implode ( "\n", $result ) );
echo time() - $time;
|
3.
Код: |
$time = time();
$keyword = preg_quote ( '/78/', '/' );
file_put_contents ( 'text.txt', preg_replace ( '/^.*?' . $keyword . '.*\n?/m', '', file_get_contents ( 'text.txt' ) ) );
echo time() - $time;
|
IMHO результаты говорят сами за себя |
|
|
|
|
|
Yabuti писал(а): |
И теперь php бросил, т.к. плохо его знаю, лучше изучить другой язык, чтобы в голове не было путаницы.
|
Взаимоисключающие параграфы. Недоучив один браться за другой. Так только путаница и останется.
cyberseo, бенчмарк шикарен. Но тебе ничего не смущает в первом варианте??? Ну хотя бы что такое $sample и откуда оно взялось.... |
|
|
|
|
|
Вы в своих бенчмарках скорее всего эффективность драйвера дискового кэша измеряете |
|
|
|
|
|
RoR намного сложнее php, вообще если освоишь любой популярный язык - проблем с освоением других не будет. PHP легче будет освоить хотя бы из-за огромного кол-ва фреймворков и готовых библиотек: flourish, CI, kohana...
Я сейчас углубленно изучаю C#, так как после его освоения можно написать что угодно, без ограничений Также изучая C#, легче усваивается ООП.
Код понятнее php и других языков веб-программирования. |
|
|
|
|
|
На самом деле, там много факторов. Если интересно, могу расписать что и почему работает быстрее на самом низком машинном уровне.
exolon писал(а): |
cyberseo, бенчмарк шикарен. Но тебе ничего не смущает в первом варианте??? Ну хотя бы что такое $sample и откуда оно взялось....
|
Гы, ну вообще да Косяк там у ТС-а, а я - старый пень и не проверил его код на адекватность - срабатывает и ладно, а что там в выдаче - х.з В любом случае, даже если его код поправить и заменить $clean = 'бесплат'; на $sample = 'бесплат'; - код все равно турбореактивным не станет (3-4 секунды у меня выполняется). Собственно, проверять надо на более тяжелых файлах, ибо 10Мб это маловато в плане погрешности. Та же однострочная версия срабатывает за секунду в очень грубом приближении - в половине случаев результат вообще 0 секунд. Т.е. там может быть как 1.2, так, например, и 0.5 секунды. |
|
|
|
|
|
BVz писал(а): |
Я сейчас углубленно изучаю C#, так как после его освоения можно написать что угодно, без ограничений Также изучая C#, легче усваивается ООП.
Код понятнее php и других языков веб-программирования.
|
Та же Java на самом деле. Только в профиль
А вот насчет "написать что угодно, без ограничений" я таки не согласен. У каждой платформы есть свои задачи. Не будешь же ты скрипты для авмчегов на нем писать (плагины те же и т.д.)
З.Ы. С C# познакомился еще тогда, когда .Net имел кодовое название Lightning и передавался сотрудничающим девелоперам исключительно как microsoft confidential под NDA (подписка о неразглашении). Честно говоря, какого-то будущего вне платформы .Net, т.е. microsoft windows, я для C# не вижу. |
|
|
|
|
|
Цитата: |
что и почему работает быстрее на самом низком машинном уровне.
|
Если ты запускаешь свои тесты без перезагрузки, то после первого теста файл будет сидеть в кэше. Разница в 9-18 раз скорее всего из-за этого.
Ну и самое медленное в этих тестах чтение построчно из файла. |
|
|
|
|
|
cyberseo писал(а): |
На самом деле, тут как бы и говорить не о чем. Во-первых, легче читается короткий код, а не длинный. В случае с простенькой однострочной регуляркой, код становится горзадо более понятным, нежели тот что с циклом, или тот, что с колбэком - тупо потому, что он на много проще и в нем меньше букоф
Кстати, понятность кода и скорость его работы, чаще всего являются взаимоисключающими понятиями. Лично я считаю, что конечному пользователю плевать на читаемость моего кода, для него главное это производительность. Конечно, если речь идет о работе, а не об обучении.
|
Конечный пользователь не смотрит код, а вот когда работаешь в команде или сам через год-два смотришь в свой код с мыслями "а что вообще делает вот этот кусок?" - вот тогда понимаешь, зачем оно надо.
Перл во многом погубило то, что это write-only язык - программист через полчаса забывал, что это у него там такое написано однострочное, так как перл очень провоцировал на такое
То, что колбэк быстрее - это было понятно, но то, что простая регулярка выигрывает у strpos - это гуд ньюс
Цитата: |
И теперь php бросил, т.к. плохо его знаю, лучше изучить другой язык, чтобы в голове не было путаницы. Качнул пакет Руби на Рельсах, Аптану, вечерами изучаю, что-то пытаюсь сделать на нем.
Нравится Руби, красивый код и не только под веб.
|
"Картошку хотя бы затем любить следует, что она ум развивает" (с) Чапаев. Весьма кардинальный поворот но я в целом одобряю Рельсы приучат к тому, как должно быть устроенным современное веб-приложение, после них и на php-фреймворках можно будет быстро научиться писать. Правда, скрипты писать будет некому, так как руби из вебмастеров никто не знает |
|
|
|
|
|
Тут дело не в том, что простая регулярка выигрывает у strpos. Кончено же strpos чуть быстрее (на самом деле именно чуть), чем простая регулярка. Весь фокус в том, что в данном случае, регулярка работает со всем текстом целиком, а strpos приходится выполнять для каждой строки, а это:
1) дополнительный вызов команд call и ret с занесением параметров на стек и последующим снятием/обработкой оных (не говоря о сохранении/восстановлении регистров процессора);
2) дополнительная инициализация локальных параметров функции (тот же счетчик и т.д.);
3) лишнее обращение к диску (построчная/блоковая запись осуществляется гораздо медленнее, чем непрерывная).
Все это делает версию с циклами и strpos более медленной, по сравнению с вызовом простой регулярки. |
|
|
|
|
|
Имхо, в случае регулярки целый текст подается на вход сишной либе, внутри которой и бежит цикл с соответствующей скоростью. Ну а цикл в php со всеми динамическими приколами будет проигрывать по скорости. Ну как-то так. |
|
|
|
|
|
|
Димитрий, загоняешь в массивы и сравниваешь их между собой
Код: |
<?php
$words1 = preg_split('#[\r\n]+#', file_get_contents('file1.txt'));
$words2 = preg_split('#[\r\n]+#', file_get_contents('file2.txt'));
$res = array_diff($words2, $words1);
$fp = fopen('res.txt', 'w');
fwrite($fp, join("\n", $words2));
fclose($fp);
?>
|
ЗЫ: код писал прям здесь, не тестил |
|
|
|
|
|
|
|