1. Си / Говнокод #8827

    +104

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    // старый "медленый" код, проверяем размеры по именам файлов (последний параметр):
    
      if((checkFileLimits(_logTimeLimit,_logSizeLimit,_logStartTime,_traceFile1)>0) ||
         (checkFileLimits(_logTimeLimit,_logSizeLimit,_logStartTime,_traceFile2)>0) ||
         (checkFileLimits(_logTimeLimit,_logSizeLimit,_logStartTime,_traceFile3)>0) ||
         (checkFileLimits(_logTimeLimit,_logSizeLimit,_logStartTime,_traceFile) >0) )
    
    // новый "быстрый" код, проверяем размеры по файл хэндлам:
    
      FILE* fp1 = fopen(_traceFile1, "r");
      FILE* fp2 = fopen(_traceFile2, "r");
      FILE* fp3 = fopen(_traceFile3, "r");
      FILE* fp4 = fopen(_traceFile, "r");
      
      if((checkFileLimitsHandle(_logTimeLimit,_logSizeLimit,_logStartTime,fp1)>0) ||
         (checkFileLimitsHandle(_logTimeLimit,_logSizeLimit,_logStartTime,fp2)>0) ||
         (checkFileLimitsHandle(_logTimeLimit,_logSizeLimit,_logStartTime,fp3)>0) ||
         (checkFileLimitsHandle(_logTimeLimit,_logSizeLimit,_logStartTime,fp4) >0) )
             setTraceFile(NULL);
    
      fclose(fp1);
      fclose(fp2);
      fclose(fp3);
      fclose(fp4);

    наши бенчмаркеры чего-то там тестировали (на NFS!!!) и нашли что некоторые модули/библиотеки используют stat() вместо fstat()/ftell() для определения размера лог/трейс файлов (для ротации этих файлов). stat() берет как параметр не хэндл, а имя файла и поэтому дороже с точки зрения производительности. в особенности на NFS. ну начальник R&D и постановил: все stat()ы заменить на fstat()/ftell(). сказано - сделано. кусок сверху из модуля который пользуется внешней либой для логов и трейсов и у которого доступа к хэндлам нету. но герои не ищут легких путей: открываем файлы, получаем хэндлы, проверяем оптимальным образом размер файлов по хэндлам, закрываем файлы, гатова!

    Запостил: Dummy00001, 14 Декабря 2011

    Комментарии (16) RSS

    • по-моему, открытие файла - сама по себе дорогая операция
      Ответить
      • открытие файла в большинстве систем самая дорогая операция (после fsync'а само собой разумеется).
        Ответить
        • а что за лимиты на размер лог файла? embedded система где места в обрез?
          Ответить
          • да нет. просто биллинговая система. лимиты просто для удобства. по умолчанию, проги переключаются на новые файлы либо после 16МБ сообщений, либо через 24 часа.
            Ответить
            • каждый процесс имеет свой индивидуальный лог-файл или один лог-файл потенциально может быть использован несколькими процессами?
              если первое, то лог файл не нужно открывать/закрывать при каждой записи в оный, при открытии нового лог-файла установить счетчик в 0 и считать в нем сколько мы в реальности успели в лог-файл записать, перед очередной записью проверять лишь условие ротации по дате (полагаю, каждые 24 часа означает ротацию в 00:00, тогда нет проблем, если же реально 24h с момента создания текущего файла, то придется дополнительно запоминать время его создания, например) и условие по переполнению - если условия выполняются, меняемся на новый файл и производим очередную запись.
              если второе (да еще и по NFS), то что то вы там переусложнили.
              Ответить
              • переусложнили? батенька, я же сказал: герои не ищут легких путей.

                мне с начала моей работы в фирме предупредили что "R&D мелочами не занимается, и делает только сверх-важные вещи." восприняв до всей глубины сказаное, представь себе что получается на выходе если их попросить написать программу для подсчета "2*2".
                Ответить
                • энтерпрайз такой энтерпрайз

                  а еще логами можно гадить по udp (на крайняк по tcp) на отдельный сервер, который уже знает что делать с ними, куда ротировать и что игнорировать
                  Ответить
                  • Веселье начнётся, когда что-то будет с сетью.
                    Ответить
                    • если в core network что-то с сетью, то там уже не до таких мелочей как пропавшие сообщения в логах.
                      Ответить
                      • Согласен. Правда, из-за кратковременного сбоя можно потерять все логи за этот период.
                        Ответить
    • Заставишь дурака богу молиться...
      Ответить
    • "Начальник всегда прав". Даже если через некоторое время заставит всё переделывать обратно.
      Ответить
    • Вот такие вот посты и придают смысл существования этому ресурсу.
      Ответить
      • Для меня как для студента очень много интересного на ГК.ру.
        Ответить
    • По-моему, и первый, и второй варианты - ГК. Но второй - большее говно.
      Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий