LINUX.ORG.RU

Рассудите

 ,


0

1

Дано:

  • счетчик с проверкой IP;
  • Darth_Revan с его говнокодом;
  • два метода решения.

Его способ заключается в том, чтобы при обращении к счетчику каждый раз считывать лог в память, добавлять новый IP, сортировать его и ложить обратно. Естественно, ему всё равно, что это сложнее, что тысячу раз читать файл - это некруто. Только полюбуйтесь на этот ужас:

#тут он получает данные
Voters=$(cat "./data/voters.txt");
UniqInfo="$REMOTE_ADDR"
if [ -n "$Voters" ]; then
  echo 'Всего возложено '$(echo "$Voters" | wc -l)' цветов';
else
  echo "Всего возложено over 9000 цветов";
fi;
if [[ $(echo "$Voters" | grep -c "$UniqInfo") != "0" ]]; then
  echo ' (вы возложили цветы).';
fi;
#!/usr/bin/env vvsh
<%
        #а вот тут идет голосование
        File="./data/voters.txt";
        UniqInfo="$REMOTE_ADDR";
        touch "$File";
        if [ -w "$File" ]; then
            Temp=$(echo "$UniqInfo" && cat "$File");
            echo "$Temp" | sort | uniq > "$File";
        fi;
        redirect http://khilmonument.whostas.com/
%>

Я не понимаю, зачем искуственно вызывать баги? Уменьшать скорость работы? Я предлагаю вот так:

#тут он получает данные
  voters="$(cat "$APPS/data/voters.txt")"
  info="$REMOTE_ADDR"
  if [ -n "$voters" ]; then
    echo "Всего возложено $(echo -e "$voters" | sort | uniq | wc -l) цветов"
  else
    echo 'Всего возложено over 9000 цветов'
  fi
  if echo -e "$voters" | grep -q -e "$info"; then
    echo ' (вы возложили цветы).'
  fi
#!/usr/bin/env vvsh
<%
  #а вот тут идет голосование
  file="$APPS/data/voters.txt";
  info="$REMOTE_ADDR";
  echo "$info" >> "$file"
  redirect 'http://khilmonument.whostas.com/'
%>

ЛОР, может ты убедишь его, что его метод хуже?

★★★★★

Последнее исправление: derlafff (всего исправлений: 6)
Ответ на: комментарий от derlafff

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

Это первый код, а второй?

Dragon59 ★★
()
Ответ на: комментарий от Dragon59

второй использует дозапись (>>) в файл и полностью читает файл только в первом фрагменте, где это делает и первый код

derlafff ★★★★★
() автор топика
Ответ на: комментарий от quasimoto

на случай, если файла нет.

хотя, не нужен он тут, пожалуй

derlafff ★★★★★
() автор топика
Ответ на: комментарий от derlafff

второй использует дозапись (>>) в файл и полностью читает файл только в первом фрагменте, где это делает и первый код

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

Dragon59 ★★
()

Оба подхода неверны, здесь нужно использовать хэш-таблицу или дерево поиска. На баше такое можно даже не пытаться писать, зато, например, на C++ с использованием std::set, получится очень легко.

gentoo_root ★★★★★
()
Ответ на: комментарий от Dragon59

Список никогда не выводится полностью, только считывается (и это несомненно происходит чаще обновления) и считается количество уникальных элементов.

derlafff ★★★★★
() автор топика
Ответ на: комментарий от derlafff

и это несомненно происходит чаще обновления)

А теперь посчитай, сколько раз одни и те же данные будут сортироваться при первом подходе и при втором. Подсказка: при первом один раз за обновление, а при втором каждый раз, когда идёт подсчёт.

Dragon59 ★★
()
Ответ на: комментарий от Dragon59

И да, зачем каждый раз пересчитывать? Храните число отдельно и инкрементируйте при каждом обновлении.

Dragon59 ★★
()

echo «Всего возложено $(echo -e »$voters" | sort | uniq | wc -l) цветов"

Не лучше ли `echo -e «$voters» | sort -u | wc -l`?

if echo -e «$voters» | grep -q -e «$info»; then

Может быть, `grep -F -x -e «$info»`?
Иначе $info считается regexp'ом, что может привести к интересным совпадениям.

AITap ★★★★★
()

если бы это это был баш, то, из чисто эстетических соображений, я бы предложил заменить
echo -e «$voters» | sort | uniq | wc -l
на
sort <<< «$voters» | uniq -c

но у тебя какой-то богомерзкий vvsh, фу таким быть

zolden ★★★★★
()
Ответ на: комментарий от zolden

но у тебя какой-то богомерзкий vvsh, фу таким быть

это библиотека-обертка над башем

derlafff ★★★★★
() автор топика

Проблема решена, теперь я буду промывать его мозги решением с использованием sqlite

derlafff ★★★★★
() автор топика
Ответ на: комментарий от derlafff

стесняюсь спросить, что за объёмы у вас такие страшные, что сортировка текстового файла так дорого стоит? может на пальцах не будем-то гадать, да посмотрим на результаты тестирования обоих методов?

zolden ★★★★★
()
Ответ на: комментарий от Deleted

для данного конкретного случая это гвозди микроскопром
данные не критичны, так что можно даже не на каждого посетителя генерить, а скажем раз в 10-100 секунд пересчитывать

zolden ★★★★★
()
Ответ на: комментарий от derlafff

Спор в том, чей метод вообще лучше

команда time лучшая гадалка в таком вопросе

zolden ★★★★★
()

а я бы модифицировал первый проход добавив ещё одну проверку что если '$(echo «$Voters» | wc -l)' вернёт 0 то дописать в файл (без всяких сортировок), а то во втором подходе файлик может бесконтрольно расти.

mm3 ★★★
()
Ответ на: комментарий от Darth_Revan

C sqlite твой сайт стал гораздо живее и веселее

zolden ★★★★★
()
Ответ на: комментарий от Darth_Revan

запихнуть все в тег фонт это очень круто

в чем смысл инклудить одну картинку как base64? (к тому же невидимую)

ZuBB ★★★★★
()
Ответ на: комментарий от Darth_Revan

Хоспаде...

SQLite плюсую, но про сайт мог бы и предупредить.

vurdalak ★★★★★
()
Ответ на: комментарий от ZuBB

запихнуть все в тег фонт это очень круто

Сначала мне надо было, чтобы оно хоть как-то работало %), а потом убрать забыл.

Darth_Revan ★★★★★
()
3 августа 2012 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.