1. C# / Говнокод #19406

    −14

    1. 1
    FileInfo[] files = dir.GetFiles().Where(i=>i.Name.EndsWith(".png") || i.Name.EndsWith(".ico")).ToArray();

    Запостил: d_fomenok, 05 Февраля 2016

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

    • Замыкание головного мозга?
      FileInfo[] files = dir.GetFiles("*.png;*.ico");
      Ответить
      • Подозреваю, что это так же выберет file.PNG, file.PnG и т.д.
        Ответить
        • Это так страшно?
          Ответить
          • думаю что на виндах это как бы и ожидаемое поведение.

            я все еще помню кошмары когда винды имена файлов которые случайно соответствовали 8.3 формату автоматом апперкейсила. (потому что в файловой системе в ДОС формате directory entry даже на NTFS создавалась.) прога создала файл - а потом его найти не может, потому что забыли case-insensitive сравнение префикса/суффикса делать. один разраб в отчаинии на дедлайне в имена файлов пробелы даже вставлял, что бы предотвратить эту ДОСнутую магию.
            Ответить
          • К тому же, винда же вроде регистр не учитывает в путях
            Ответить
        • Говнокодить так говнокодить
          FileInfo[] files = dir.GetFiles().Where(i=>i.Name.EndsWith(".png", StringComparison.CurrentCultureIgnoreCase) || i.Name.EndsWith(".ico", StringComparison.CurrentCultureIgnoreCase)).ToArray();
          Ответить
      • по крайней мере на юнихах, подобные чудеса (глобы) заметно медленнее чем тупое чтение каталога и фильтрование по суффиксам. (я тестил в обратную сторону: насколько глобы медленнее чем тупое чтение+фильтр. в моих тестах на встроенном арме ~15-20% медленнее было.)
        Ответить
        • А фильтр как был реализован?
          Ответить
          • strncmp() и/или strstr().
            Ответить
            • Ясно. Ну тогда даже компиляция в автомат, походу, проиграет (если там не тысячи файлов).
              Ответить
        • На юнихах - это типа на мейнфреймах? Файловых систем реализующих Юникс десятки, если не сотни. Как-то мне слабо верится что во всех такая операция будет столько же времени занимать.

          Пример обратного: допустим мы смонтировали NFS систему локально, и, допустим наш клиент и сервер умеют пересылать глобы. В таком случае мы не потратим время на пересылку данных, которые можно было отфильтровать уже на сервере.
          Ответить
          • > На юнихах - это типа на мейнфреймах?

            Мейнфреймы это IBM и совсем не юнихи.

            > Файловых систем реализующих Юникс десятки, если не сотни.

            Намного меньше. Большинство файловых систем были тупо содраны с BSD'шной реализации, aka UFS.

            > Как-то мне слабо верится что во всех такая операция будет столько же времени занимать.

            Я и не говорил что на всех систем столько же времени занимает.

            > Пример обратного: допустим мы смонтировали NFS систему локально, и, допустим наш клиент и сервер умеют пересылать глобы.

            Не умеет.

            VFS (virtual file system) интерфейс в кернелах почти везде одинаковый и крутится во круг базовых системных вызовов (open/pread/pwrite/close/opendir/readdir/closedir). NFSы реализуются на основе VFS и дополнительных функций физически предоставить не способны.

            а glob() и wordexp() вечно были и навсегда останутся примочками из libc.

            > В таком случае мы не потратим время на пересылку данных, которые можно было отфильтровать уже на сервере.

            Но все равно каталог надо будет читать полностью, где бы ты его не читал: клиент или сервер. Сетка по сравнению с винтом все еще быстрее.
            Ответить
            • > Сетка по сравнению с винтом все еще быстрее.
              Ну здесь можно возразить тем, что разгон до топовой скорости у tcp/ip не мгновенный, да и вообще, емнип, недостижим на дефолтном карликовом окне...
              Ответить
            • > Это IBM
              И что... IBM разрабатывали и разрабатывают ПО для мейнфреймов, в том числе файловые системы, в том числе и такие, которые реализуют Юникс стандарты (более того, последние - как бы самые популярные).

              Откуда инфа про меньше? Есть куча проприетарных систем установленых в датацентрах и т.п. местах, куда только по пропускам. И про "содраны" - это очень смелое заявление. Да, есть популярная книжка, которая использует UFS для иллюстрации того как в принципе можно реализовать файловую систему, но это как бы ничего особо не значит. Ну, к примеру, взять тот же Докер, где они сами написали две файловые системы, совсем не похожие на UFS. Да и вообще, цимес современных файловых систем не в том, как определить структуры данных для файлов и каталогов - это < 1% от всей работы. Интересные проблемы: кластеринг, кеширование, "хотсвоп" и т.п.

              Откуда уверенность в том, что NFS не умеет? Я вот на днях к нашему NFS клиенту прикрутил оптимизированое рекурсивное удаление директорий. Если бы было нужно, то и глоб тоже бы прикрутил.

              Сетка может быть быстрее флешек, иногда. Но есть очень много уровней перенаправления. На самом деле выиграет тот, кто первый закеширует.
              Ответить
              • > Есть куча проприетарных систем установленых в датацентрах и т.п. местах, куда только по пропускам.

                Рынок на столько мелкий что только Veritas какие-то деньги на этом и зарабатывает. Все остальные двигаются в направлении distributed block device.

                И бывал я в тех датацентрах в которые только по пропускам... Шумно и холодно.

                > И про "содраны" - это очень смелое заявление.

                Не просто содраны. Еще лет 10 назад они все еще UFS и назывались. У БСД была своя UFS. У HP-UX была своя. На AIX, SunOS, Solaris, SCO - у всех была "Unix File System" которые слегка с друг-другом были не совместимы.

                > Откуда уверенность в том, что NFS не умеет?

                Потому что (1) (еще раз) кернелы этого не умеют (glob == userspace), и (2) https://www.ietf.org/rfc/rfc3530.txt
                Ответить
              • что бы обобщить: не спорь с системщиком о файловых системах. если хочешь, почитай про линухову реализацию. на остальных юнихах либо подобно, либо еще хуже.
                Ответить
                • Да при чем здесь кернелы? Клиент и сервер NFS - могут быть запущены кем угодно, кернел тут вообще не принимает участия. NFS требует чтобы . и .. интерпретировались специальным образом. Ничего по поводу * нету. Если я захочу, чтобы * интерпретировалось как специальный запрос, и мой сервер это умеет - кто мне запретит?

                  Что касается UFS, то можно это воспринимать как набор свойств файлов и каталогов, т.е. определенный список аттрибутов, привилегий и т.д. А можно воспринимать как отсылку к конкретной реализации, например, описаной в книжке Practical Filesystem Design, на примере BFS. Но в любом случае, речь о том, что то, что общее у этих файловых систем - это тривиально в написании, и не занимает даже 1% от всего кода реализующего ту или другую систему. Разница же в стратегиях чтения-записи, в том реализуется ли система на аппаратном уровне или на уровне приложения, в том как реализованы дефрагментация, логгирование, восстановление, кластеринг, в том, как построить кеширование в зависимости от аппаратной части, и т.д.

                  Сказать что все файловые системы содраны с UFS потому что в них есть одинаковые аттрибуты у файлов, это как сказать что все програмы содраны с интернет эксплорер 5 потому что в них использованы функции конвертации строк в числа.

                  Ну и что, что ты системщик? А я вот работаю в компании, которая разрабатывает файловую систему для тех самых датацентров, куда только по пропускам. Мне больше всего довелось разбираться с AUFS докеровской, но я так же немножко знаю и про Btrfs и про XFS. Ну и конечно, про NFS, т.как с этим работаю каждый день.
                  Ответить
                  • > Да при чем здесь кернелы? Клиент и сервер NFS - могут быть запущены кем угодно, кернел тут вообще не принимает участия.

                    и куда по твоему уходят сисколлы open()/read() и т.д.?

                    > Мне больше всего довелось разбираться с AUFS докеровской

                    8 лет траханий с веритасом. шутка: работает на ура, но стоит столько бабла что никто не покупает, а пользуются NFS. c которым и трахался.

                    > Сказать что все файловые системы содраны с UFS

                    мля, да не говорил я этого!

                    я не уверен что вы на самом деле там "файловую систему" делаете - а не какой очередной "object storage".
                    Ответить
                    • Системные вызовы будут только если ты будешь пользоваться этой файловой системой через интерфейс предоставляемый кернелом. Но никто тебя не обязует им пользоваться.

                      Если не веришь - возьми тестовые фреймворки типа SFS2008, SFS2014 или Vdbench - они все пользуются NFS клиентом написаным на Яве, и работают с файловой системой без участия кернела.

                      > Я не уверен ...
                      Лол
                      Ответить
                      • > они все пользуются NFS клиентом написаным на Яве

                        *facepalm* I weep for your data.

                        > > Я не уверен ...

                        > Лол

                        не ну теперь я точно уверен что это и не файловые системы и не NFS.
                        Ответить
                        • Не, ну а почему FS обязана находиться в ядре и быть написанной на си? Взять ту же fuse - так она через ядро прокручивает сисколлы только ради совместимости с существующим софтом. Не нужна была бы совместимость (или можно было бы подменить либы) - FS можно и полностью в юзермоде сделать, от ядра только посекторное i/o или сокеты понадобятся.
                          Ответить
                          • > Не, ну а почему FS обязана находиться в ядре и быть написанной на си?

                            Потому что приложения доступаются к файловой системе через ядро.

                            Потому что кернел это единая точка синхронизации доступа между приложениями.

                            > Взять ту же fuse

                            bandwidth хороший, но тормозит на meta data.

                            > от ядра только посекторное i/o или сокеты понадобятся.

                            fuse никогда не обгонит ядро из-за overhead'а контекст свитчей. вот такой простой ответ.

                            и так файловые системы меняются редко, то просто смысла в fuse для больших проектов мало.

                            object storage по крайней мере решают проблему.
                            Ответить
                            • > оверхеда контекст-свичей
                              Чтение с диска (даже ссд) уже стало быстрее, чем переключение контекста?
                              Ответить
                              • хез. я задержек/тайминга/этц новых шин не знаю.

                                скорее всего context-switch быстрее. хваленые 100К IOPs без глубоких очередей не достигнешь. глубокие очереди == большие задержки. ожидание ответа/стояние в очереди + обработка прерываний == навярняка медленее чем контекст свитч.

                                ЗЫ там где я работал, SSD было слишком дорогим удовольствием. стораджы нужны нехилых размеров, а 1TB SLC SSD стоит 2-4 килобакса. максимум где использовался это для лога (log, journal) транзакций на оракаклевых серваках.
                                Ответить
                          • Сейчас модно software-defined storage. Т.е. когда файловая система существует как процесс / сервис, который можно и перезапустить, если нужно. Или, если нужно поделить диск по-новой, чтобы не нужно было перезапускать систему и т.д.
                            Есть много вариантов это реализовать. По-сути базы данных это делали всегда, в каком-то смысле. Такой вариант как с базами данных можно реализовать за счет создания loopback device, который будет выступать в качестве block device для следующего уровня файловой системы с одной стороны, и как обычный файл - для кернела. Производительность будет зависеть от конкретной файловой системы обеспечивающей этот самый loopback device.
                            Ответить
                        • Ага, ну ты точно много знаешь про файловые системы. Особенно про их тестирование. :) Ну и по-совместительству про то, чем занимается компания в которой я работаю (главное уверенность!).

                          Ну вот сходи на сайт к Ораклю и почитай про Vdbench, зачем он существует и кто им пользуется. Ты ж этого не сделал, а вместо этого авторитетно пернул в лужу...
                          Ответить
                          • > Ну вот сходи на сайт к Ораклю

                            Я работал 8 лет на стратегического партнера Оракла (Эрикссон). Я это шарашку из нутри знаю. А ты мне тут байки по мотивам рекламных материалов расказываешь...

                            > и почитай про Vdbench

                            он умеет сбои электичества симулировать? или битую сеть? битую память?
                            Ответить
                            • сть про ЕЦЦ ошибки и попытаться что-то исправить? Или паника-светодиодики?ки и попытаться что-то исправить (хотя бы коду тех же фс)? Или паника-светодиодики?
                              Ответить
                              • Ёбаный андроид.
                                Ответить
                              • на HP-UX 11.23 один раз видел: ни паники, ничего - просто сообщение в лог и мыло админу. я на одном серваке (где у кастомера часто были проблемы, и файловая система билась 2-3 в неделю) в syslog'е нашёл источник их проблем (которые они пытались валить на наш софт).
                                Ответить
                                • > HP-UX 11.23

                                  а да. это был SuperDome сервак. там вроде есть отличия как ECC работает на разных типах серваков.
                                  Ответить
                            • Ядро позволяет узнать про ошибки ЕЦЦ и что-то с этим сделать (хотя-бы внутри ядра)? Или паника-светодиодики?
                              Ответить
                            • Конечно. Vdbench - это бенчмарк тест. Меряет сколько данных файловая система может записать / прочитать и т.д. Это не тест на выносливость / устойчивость к ошибкам / чего еще. Зачем ему симулировать сбои электричества? Но ты ж знаешь лучше, конечно.

                              При чем тут реклама - я не в курсе. Речь до сих пор была о том, что NFS клиент и сервер можно реализовать без того, чтобы он работал с кернелом. Ровно точно так же, как, например, FTP. Перед тобой конкретная реализация. Плохая она или хорошая - не мне судить. Но она же существует.
                              Ответить
                              • "Речь до сих пор была о том, что NFS клиент и сервер можно реализовать без того, чтобы он работал с кернелом."

                                Да можно. А толку, если для того что бы этим могло пользоватся пользовательское приложение либо (1) его надо переписывать что бы работало с другим интерфейсом или (2) прокладку в ядре делать (типа fuse).

                                "Плохая она или хорошая [...]"

                                Слово: "бесполезная".

                                Ты работаешь с object storage. Это другая пестня и для других целей. Сравнивать с файловыми системами просто не имеет смысла. Интерфейс как у файловой системе для object storage это просто побочный опциональный бонус, не более. Заменой файловой системы это не является.

                                Как некто кто работал долго с Veritas я тебе могу так же объяснить почему народ толкает object storage: потому что лицензия на Veritas CFS стоит просто охренительных денег. Мало кому нужны все фичи - народ просто хочет нечто надежнее чем NFS, и дешевле чем "правильная" CFS.
                                Ответить
                                • Какое ядро? Лол. Ну сколько можно бредить? NFS - точно такая же надстройка над TCP или UDP как тот же HTTP. Для того, чтобы им пользоваться совсем не нужно обращаться к ядру системы (ну, за исключением сетевых вещей). Да, для Линуксов есть пакет типа nfs-utils или nfs-commons, который можно использовать для того, чтобы на уровне ядра создать для приложений абстракцию файловой системы. И в этом контексте приложениям да понадобится обращаться к ядру для того чтобы работать с файлами.
                                  Где это, например, не понадобится: при работе с технологиями виртуализации типа Докера.

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

                                  С чего ты вообще взял обжект сторидж... Ну и конечно, ты ж иксперт и в курсе про полезность или бесполезность бенчамарк тестов, о которых узнал полчаса назад.
                                  Никакой это нe обжект сторидж. Это файловая система для датацентров VMWare, где нужно больше возможностей по управлению ресурсами и более быстрые сетевые протоколы.
                                  Ответить

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