1. Lua / Говнокод #24031

    +1

    1. 1
    2. 2
    3. 3
    4. 4
    local buff = ""
    for line in io.lines() do
         buff = buff .. line .. "\n"
    end

    Несмотря на его безобидный вид, этот код может сильно ударить по быстродействию для больших файлов:
    например, чтение файла размером 1 Мб занимает 1,5 минуты

    Запостил: 3oJIoTou_xyu, 29 Марта 2018

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

    • Классика.
      http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html
      Ответить
    • Глубже...
      Ответить
    • Полагаю что прошлый buff остается в куче, и в ней же создается новый из buff + строка из файла

      хуй
      хуйхуй
      хуйхуйхуй
      хуйхуйхуйхуй

      итд

      Прежде чем GC его заберет у тебя будет тратиться память.

      В жабах и CLR для этого есть StringBuilderы
      Ответить
    • чортов тролль! это же пример из PIL (равно как и твой пример с оператором сисек)
      11.6 String Buffers
      Suppose you are building a string piecemeal, for instance reading a file line by
      line. Your typical code would look like this:
      local buff = ""
      for line in io.lines() do
      buff = buff .. line .. "\n"
      end
      Despite its innocent look, this code in Lua can cause a huge performance penalty
      for large files: for instance, it takes 1.5 minutes to read a 1 MB file on my old
      Pentium machine.1
      Ответить
    • блядь
      почему
      a = {"a", "b", "c"}
      table.concat(a, ",") --a,b,c
      a:concat(",") --не работает???
      Ответить
      • показать все, что скрытоvanished
        Ответить
        • показать все, что скрытоvanished
          Ответить
        • показать все, что скрытоvanished
          Ответить
          • показать все, что скрытоvanished
            Ответить
            • table["concat"] это тоже самое что table.concat
              в луа это одно и тоже
              Ответить
            • показать все, что скрытоvanished
              Ответить
              • Похоже что мембера "concat" нету у отдельно взятой таблицы. В модуле table такой метод есть, а в таблице нет.
                Ответить
                • показать все, что скрытоvanished
                  Ответить
                  • да-с
                    хуйня-с

                    вот у строки есть
                    a = ""
                    a.find --function
                    
                    а у таблы нема
                    a = {}
                    a.concat --nill

                    ташто в table.concat table это модуль(сиречь таблица) а не тип.

                    Вооще говоря противно конечно, почти так же противно как тот факт што
                    ``"A".find`` это синт ошибка, а
                    a = ""
                    a.find --это функция

                    Lua непредскаузем, как C++:)
                    Ответить
                    • показать все, что скрытоvanished
                      Ответить
                      • нещитово, бо так можно любую функцию в любую таблицу запиахть

                        petuh = {1, 2, 3, ["len_2"] = function(t) return #t * 2 end}
                        
                        print(petuh:len_2())


                        даже твой пример можно переписать так
                        petuh = {1, 2, 3, ["hujat"] = table.concat}
                        
                        print(petuh:hujat(","))
                        Ответить
                        • показать все, что скрытоvanished
                          Ответить
                          • он типа метатейблу своему делегирует вызовы которые сам не умеет?)

                            лол, этоже прототи наследованне (я еще до ООП не дочитал)
                            Ответить
                          • лгун
                            tbl = {1,2,3}
                            
                            setmetatable(tbl, table)
                            
                            print(tbl:concat(","))

                            lua: attempt to call method 'concat' (a nil value)


                            metatableу делегируются вызовы неизветсных методов, вставки, получения длины итд, но только надо это явно сообшщить
                            Ответить
                            • показать все, что скрытоvanished
                              Ответить
                              • попробуй перезагрузиться
                                три раза

                                пишут что у метатаблы есть метод __index, который вызывается при обращении по индексу при отсутвтвии значения

                                tbl = {1,2,3}
                                
                                meta = { 
                                 __index = function(tb, i)
                                   return i * 2 --тут tb -- это табла а i это индекс
                                 end
                                }
                                
                                tbl = setmetatable(tbl, meta)
                                print(tbl[1]) --1
                                print(tbl[100500]) --201000


                                Вероятно можно это как-то обыграть
                                Ответить
                                • показать все, что скрытоvanished
                                  Ответить
                                  • И для конкатенации есть метаметод __concat который прекрасно подойдет для table.concat
                                    Ответить
                                • показать все, что скрытоvanished
                                  Ответить
                                  • С табле легко метатаблу привязать. А юзердата луа не может никак работать, так как это прилетающая хуета из си, дописывать интерплиттор только.

                                    И к коду выше. Зачем мучаться каждый раз привязывать метатаблицу к таблице, заебешься когда у тебя будет 100500 таблиц и придеться явно каждый раз привязывать данную метатаблицу.
                                    Можно юзнуть метаметод __newindex у _G, главное в рекурсию не улететь. И когда мы будет создавать глобаль уже будет автоматом таблице привязавоться метатаблица с методом __index с той самой библой table.
                                    С локалями данный метод не работает так как локали не создаются в _G а где-то в другом месте. Пока сам не знаю где, не доходило дело и до них.
                                    Ответить
                                  • У строки по моему нельзя привязать метатаблицу если отключен (или включен) дебаг.
                                    Ответить
                                  • > Парсер — лох, поэтому "петух":format не работает. Приходится литерал сохранять во временной переменной.
                                    Зойчем зосорять просранство имён?
                                    ("питух"):format
                                    Ответить
                                    • ахаха
                                      работает
                                      ("petuh"):upper()
                                      Ответить
                                    • >>Зойчем зосорять просранство имён?

                                      незасорил пространство имен, проверьт
                                      tbl = {}
                                      
                                      do 
                                        local foo = {__index = function() return 42 end}
                                        setmetatable(tbl, foo)
                                      end
                                      
                                      print(foo) --будет nil
                                      print(tbl[100400]) --будеьт 42
                                      Ответить
                                      • И тут прилетает сборщик мусора
                                        Ответить
                                        • И ничего особо и не сделает
                                          Ответить
                                          • collectgarbage = nil
                                            Ну теперь точно ничего не сделает, потерял ссылку на сам сборщик.
                                            Добро пожаловать утечка
                                            Ответить
                                          • конечно не сделает

                                            foo зажат у setmetatable между булками

                                            В луа же так идеома итератора работает
                                            function Spam()
                                              local i = 0 --i снаружи не видать
                                              return function() if i < 42 then return 1 else return nil end
                                            end
                                            
                                            for i in Spam() do 
                                              print(i)
                                            end
                                            Ответить
                                            • Так когда он вышел за границы блока он же тупо теряет ссылку к значению, но само значение валяеться и тухнет. К тому же был случай, когда запускаешь сборщик мусора в поток параленьно работающей функцией у которой кучи локалей, и ждешь когда что наебнеться
                                              Ответить
                                              • >>, но само значение валяеться и тухнет
                                                так гц же

                                                >>сборщик мусора в поток параленьно
                                                так, вот отсюда поподробнее.

                                                Я знаю только про корутины которые работают в одном треде операционки.

                                                Разве в луа есть какие-то другие треды?

                                                Что будет если у меня переменная указывает на объект, который забрал гц? Может так быть? Если да, то что будет? nil?
                                                Ответить
                                                • В чистом луа - нет.
                                                  Нет не нил, а помоему вывалится с ошибкой. НО ВСЕ ЭТО НИТОЧНО, НАДО БОЛЬШЕ ИСЛЕДОВАНИЙ, я давно с этим баловался
                                                  Ответить
                                                  • а, ну понятно: если host каким-то образом зачистил что-то на что есть ссылка то может быть что угодно

                                                    гарантировать патокабизопастность должен host, в который встроен lua

                                                    сам lua для этого средств не имеет
                                                    Ответить
                                  • >> userdata создаётся своя метатаблица на каждый экземпляр, поэтому её придётся привязывать после каждого вызова конструктора.
                                    Пиздешь.
                                    file = io.open("petux.txt","r")
                                    file:close()
                                    Ответить
                      • показать все, что скрытоvanished
                        Ответить
                        • ого, я чото не знал что

                          foo = {["spam"] = 42}
                          можно записать как
                          foo = {spam = 42}

                          Что то есть неуловимое от старого JSа где объект есть массив ассоциативный
                          Ответить
                • показать все, что скрытоvanished
                  Ответить
                • показать все, что скрытоvanished
                  Ответить
                  • я два раза два раза не повторяю не повторяю
                    Ответить
                    • 1. Повторил тебе джважды, проверь.
                      2. Повторил тебе джважды, проверь.
                      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить

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