Який загальний консенсус щодо «марного використання котів»?


41

Коли я передаю декілька команд unix, таких як grep, sed, tr тощо, я схильний вказувати вхідний файл, який обробляється за допомогою cat. Так щось на кшталт cat file | grep ... | awk ... | sed ....

Але нещодавно, після пари коментарів щодо моїх відповідей, що вказували на те, що це непридатне використання кота, я подумав, що я поставити питання тут.

Я переглянув цю проблему і натрапив на статтю Вікіпедії про УУПЦ та «Безкорисне використання котячої премії», і мені здається, що наведені аргументи є з точки зору ефективності.

Найближче питання, на яке я зіткнувся тут, було таке: чи марно називати кота? - але це не зовсім те, про що я прошу.

Я думаю, що табір UUOC пропонує використовувати cmd1 args < file | cmd2 args | cmd3 ..або якщо команда має можливість читати з файлу, а потім передавати файл як аргумент.

Але мені cat file | cmd1 ... | cmd2здається набагато простіше читати і розуміти. Мені не потрібно пам’ятати різні способи надсилання вхідних файлів до різних команд, і процес логічно протікає зліва направо. Спочатку введення, потім перший процес ... і так далі.

Я не розумію, які аргументи висловлюються щодо марного використання кота? Я розумію, що якщо я виконую роботу з кроном, яка виконує кожні 2 секунди і робить багато обробки, то в такому випадку кішка може бути марною. Але інакше який загальний консенсус щодо використання кота?


16
Я згоден, тут заклик до кота може бути неефективним, але це робить команду набагато простішою для розуміння та редагування пізніше, і (що важливо, IMO) відокремлює кожну іншу команду, щоб мати лише одну роботу, що робить цю справу набагато легшою для вирішення з.
Фоші

4
Загальний консенсус полягає в тому, що консенсусу немає.
jwg

2
Це значною мірою копіює stackoverflow.com/questions/11710552/useless-use-of-cat (хоча це раніше).
трійка

1
Не забувайте, що це < file cmd1 args | cmd2 args ...теж працює ... тому ваш аргумент " зліва направо " недійсний. Я часто використовую це для наочності - порядок, який я показав, може змусити людей робити паузу, що не добре. Коли більш високі показники ниток стають нормою, це стає менше питання ІМО ...
Attie

Відповіді:


21

Це марно в тому сенсі, що при використанні такого способу нічого не вдається досягти інших, можливо, більш ефективних варіантів не можна (тобто давати належні результати).

Але catспосіб більш потужний, ніж просто cat somefile. Порадьтеся man catчи прочитайте те, що я написав у цій відповіді . Але якщо вам абсолютно позитивно потрібен лише вміст одного файлу, ви можете отримати певну перевагу в роботі від використання, catщоб не отримати вміст файлу.

Що стосується читабельності, це залежить від ваших особистих смаків. Мені подобаються catфайли в інших командах з тієї ж причини, особливо якщо аспекти продуктивності незначні.

Це також залежить від сценаріїв. Якщо це ваша власна оболонка та зручні методи для вашої настільної машини, ніхто, крім вас, не піклується. Якщо ви натрапите на випадок, коли наступний інструмент у ланцюжку було б краще шукати, і поширювати це як часто використовуваний фрагмент програмного забезпечення в якійсь мінімальній системі Linux на низькопродуктивній маршрутизаторі або подібному пристрої з реальними обмеженнями на здатність до обробки, це різне. Це завжди залежить від контексту.


3
Чи незначні витрати на продуктивність? У багатьох випадках це: oletange.blogspot.dk/2013/10/useless-use-of-cat.html
Ole Tange

15

У використанні командного рядка щодня це не дуже сильно відрізняється. Ти особливо не помічаєш різниці в швидкості, оскільки час на процесорі уникаєш не використовувати cat, процесор просто простоює. Навіть якщо ви переглядаєте сотні чи тисячі (а то й сотні тисяч) предметів у всій практичності, це не має великого значення, якщо ви не перебуваєте у дуже завантаженій системі (Load Average / N CPU> 1).

Те, де гума зустрічається з дорогою, полягає у формуванні добрих звичок та відлякуванні поганих. Щоб витягнути цвіле кліше, чорт у деталях. І саме такі деталі відокремлюють посереднє від великого.

Це як під час руху автомобіля, навіщо робити поворот наліво, коли замість цього можна просто зробити три права? Звичайно, можна, і це прекрасно працює. Але якщо ви зрозуміли силу лівих поворотів, то три права просто здаються дурними.

Йдеться не про збереження однієї файлової ручки, 17 кб оперативної пам’яті та 0,004 секунди часу процесора. Йдеться про всю філософію використання UNIX. "Сила лівих поворотів" на моїй ілюстрації не є просто перенаправляючим вкладом, це філософія UNIX. Повністю гарнуючи це, ви зробите вас кращим, ніж ті, хто вас оточує, і ви отримаєте повагу у тих, хто розуміє.


2
Якщо ви думаєте про поворот ліворуч на 6-смужну автомобільну дорогу без світлофора, то, можливо, вам доведеться розглянути поворот праворуч або взяти інший маршрут. * nix надає вам вибір декількох маршрутів. Це питання особистої переваги та читабельності. Якщо ви хочете "котячий файл | cmd1 | cat | cmd2 | більше", продовжуйте. (Іноді це корисно, якщо cmd1 пагінує - кішка усуне це.) $ CPU час << $ Мозок часу.
MikeP

1
@MikeP Не catвдасться усунути жодних сторінок, хоча трубопроводи до чогось можуть усунути підкачки деяких програм.
трійка

14

Я часто використовую cat file | myprogramв прикладах. Іноді мене звинувачують у марному використанні кота ( http://www.iki.fi/era/unix/award.html ). Я не згоден з наступних причин:

Неважко зрозуміти, що відбувається.

Читаючи команду UNIX, ви очікуєте, що команда супроводжується аргументами, за якими слід перенаправлення. Це є можливість поставити перенаправлення де - небудь , але це рідко - таким чином , у людей буде більше часу на читання приклад. я вірю

    cat foo | program1 -o option -b option | program2

легше читати, ніж

    program1 -o option -b option < foo | program2

Якщо перенести перенаправлення на початок, ви заплутаєте людей, які не звикли до цього синтаксису:

    < foo program1 -o option -b option | program2

і приклади повинні бути легко зрозуміти.

Це легко змінити.

Якщо ви знаєте, що програма може читати з кота, ви можете припустити, що вона може прочитати вихід з будь-якої програми, яка виводить на STDOUT, і, таким чином, ви можете адаптувати її до власних потреб і отримати передбачувані результати.

Він підкреслює, що програма не дає збоїв, якщо STDIN не є звичайним файлом.

Небезпечно припускати, що якщо program1 < fooпрацює, то cat foo | program1також буде працювати. Тим НЕ менше, це на практиці можна припустити протилежне. Ця програма працює, якщо STDIN є файлом, але виходить з ладу, якщо вхід є трубою, оскільки він використовує search:

    # works
    < foo perl -e 'seek(STDIN,1,1) || die;print <STDIN>'

    # fails
    cat foo | perl -e 'seek(STDIN,1,1) || die;print <STDIN>'

Я розглянув покарання за ефективність на http://oletange.blogspot.dk/2013/10/useless-use-of-cat.html Висновок не використовувати, cat file |якщо складність обробки схожа на просту греп а ефективність має більше значення, ніж читабельність. Для інших ситуацій cat file |це добре.


1
Нарешті відповідь із фактичними орієнтирами. Я також зазначу тут свій коментар, що "іноді" кішка може бути швидшою. Єдиний раз, коли я можу уявити, що "марне використання кота" є фактичним збитком, якщо ви робите тривіальну обробку файлів huuuge (або якщо процес може спеціально використовувати stdin, як команда хвоста) ... unix.stackexchange. com / a /
225608/8337

12

Я думаю, що позиція деяких з тих, хто коментує те, що щось є UUOC, полягає в тому, що якщо хтось дійсно розуміє синтаксис Unix і оболонки оболонки, то в цьому контексті не можна використовувати кота. Це схоже на використання поганої граматики: я можу написати речення, використовуючи погану граматику, і все-таки зрозуміти свою думку, але я також демонструю своє слабке розуміння мови та, по суті, погану освіту. Так що сказати, що щось є УУПЦ - це ще один спосіб сказати, що хтось не розуміє, що вони роблять.

Що стосується ефективності, якщо ви виконуєте конвеєр з командного рядка, для виконання машини потрібно менше часу, cat somefile |ніж для вас, щоб подумати про те, чи може це бути більш ефективним у використанні < somefile. Це просто не має значення.


6
Досить довгий час я знав, що існують інші способи вираження cat somefile | progв оболонці без кота, як, prog < somefileале вони мені завжди здавалися в неправильному порядку, особливо з ланцюжком команд, з'єднаних разом. Тепер я бачу, що щось таке елегантне, як < somefile progі хитрість, дякую. У мене закінчилося виправдання, яке мені залишилося використовувати кота.
Алекс

4

Мені не було відомо про нагороду до сьогодні, коли якийсь новичок намагався прив’язати УУПЦ до мене за однією з моїх відповідей. Це було cat file.txt | grep foo | cut ... | cut .... Я віддав йому частину своєї думки, і лише після цього відвідав посилання, він дав мені посилання на походження нагороди та практику цього робити. Подальший пошук привів мене до цього питання. На жаль, незважаючи на свідомий розгляд, жодна з відповідей не включила мого обґрунтування.

Я не мав на увазі захищати його, коли виховував його. Зрештою, в мої молодші роки я написав би команду, grep foo file.txt | cut ... | cut ...тому що, коли ви робите часті сингли grep, ви дізнаєтесь про розміщення аргументу файлів, і ви знаєте, що перший - це шаблон, а пізніше - це назви файлів.

Це був свідомий вибір, коли я відповів на запитання з catпрефіксом частково через причину "гарного смаку" (словами Лінуса Торвальдса), але головним чином з переконливої ​​причини функціонування.

Остання причина важливіша, тому я викладу її першою. Коли я пропоную трубопровід як рішення, я очікую його повторного використання. Цілком ймовірно, що трубопровід буде доданий в кінці або зрощений в інший трубопровід. У такому випадку аргумент файлу grep прискорює повторне використання, і цілком можливо, зробіть це мовчки без повідомлення про помилку, якщо аргумент файлу існує. І. е. grep foo xyz | grep bar xyz | wcдасть вам кількість рядків, що xyzмістять, barпоки ви очікуєте кількість рядків, що містять і fooі, і bar. Необхідність змінити аргументи команді в конвеєрі перед її використанням схильна до помилок. Додайте до нього можливість мовчазних збоїв, і це стає особливо підступною практикою.

Колишня причина також не є важливою, оскільки багато "гарного смаку" просто інтуїтивне підсвідоме обгрунтування таких речей, як мовчазні невдачі, про які ви не можете подумати в той момент, коли хтось, хто потребує освіти, каже "але це не так той кіт марний ".

Однак я спробую також усвідомити колишню причину "доброго смаку", яку я згадав. Ця причина пов'язана з ортогональним дизайнерським духом Unix. grepне робить cutі lsне робить grep. Тому як мінімум grep foo file1 file2 file3йде проти дизайнерського духу. Ортогональний спосіб це зробити cat file1 file2 file3 | grep foo. Тепер grep foo file1це лише особливий випадок grep foo file1 file2 file3, і якщо ви не ставитесь до цього так само, ви принаймні використовуєте цикли мозку годинника, намагаючись уникнути марної нагороди котам.

Це призводить нас до аргументу, який grep foo file1 file2 file3об'єднує, і catоб'єднує, так що це належить, cat file1 file2 file3але тому cat, що не є об'єднувальним, cat file1 | grep fooтому ми порушуємо дух catі Всемогутнього Unix. Ну, якщо б це було так, то Unix потрібна була б інша команда, щоб прочитати вихід одного файлу і виплюнути його на stdout (а не пропагувати його чи нічого просто чистого коса для stdout). Таким чином, у вас виникла б ситуація, коли ви говорите cat file1 file2або говорите, dog file1і сумлінно пам’ятаєте, щоб уникнути cat file1отримання нагороди, а також уникати, dog file1 file2оскільки, сподіваємось, дизайн dogможе призвести до помилки, якщо вказано кілька файлів.

Сподіваємось, що в цей момент ви співчуваєте дизайнерам Unix за те, що вони не включають окрему команду, щоб виплюнути файл в stdout, а також іменувати catconcatenate, а не давати йому якесь інше ім'я. <edit>є така собака, нещасний <оператор. Прикро, що його розміщення в кінці трубопроводу запобігає легкому компостуванню. Не існує синтаксичного чи естетично чистого способу розмістити його на початку. Також прикро не бути достатньо загальним, тому ви починаєте з собаки, а просто додаєте інше ім'я файлу, якщо ви також хочете, щоб воно було оброблене після попереднього. (З >іншого боку, це не наполовину погано. Він має майже ідеальне розміщення в кінці. Зазвичай це не частина багаторазового використання трубопроводу, і, відповідно, його виділяють символічно.)</edit>

Наступне питання: чому важливо мати команди, які просто плюють на файл або об'єднання декількох файлів у stdout, без подальшої обробки? Одна з причин - уникати наявності кожної однієї команди Unix, яка працює на стандартному вході, щоб знати, як розібрати принаймні один аргумент файлу командного рядка та використовувати його як вхідний файл, якщо він існує. Друга причина - уникати пам’яті користувачам: (a) куди йдуть аргументи імені файлів; та (b) уникати тихої помилки в трубопроводі, як згадувалося вище.

Це підводить нас до того, чому у grepних є додаткова логіка. Обґрунтування полягає в тому, щоб дозволити вільне користування командами, які часто використовуються та окремо (а не як конвеєр). Це невеликий компроміс ортогональності для значного збільшення зручності використання. Не всі команди повинні бути розроблені таким чином, і команди, які не часто використовуються, повинні повністю уникати зайвої логіки аргументів файлів (пам'ятайте, додаткова логіка призводить до зайвої крихкості (можливість помилки)). Виняток - дозволити аргументи файлів, як у випадку з grep. (до речі, зауважте, що lsє зовсім інша причина не просто приймати, але в значній мірі вимагати аргументів файлів)

Нарешті, що можна було б зробити краще, якщо такі виняткові команди, як grep(але не обов'язково ls), створюють помилку, якщо стандартний вхід є. Це розумно, тому що команди містять логіку, яка порушує ортогональний дух всемогутнього Unix для зручності користувача. Для подальшої зручності користувача, тобто для запобігання страждань, спричинених тихим збоєм, такі команди не повинні вагатися з порушенням власного порушення, попереджаючи користувача, якщо є можливість беззвучного відмови.


1
Як обговорювалося на міжміському дублікаті цієї відповіді та питання, grep pattern f1 f2 f3це не проста конкатенація . grepзнає про файли та друкує назви файлів (і необов'язково номери рядків та все інше). grep . /sys/kernel/mm/transparent_hugepage/*це хороший злом для друку імені файлу: вміст файлу з великою кількістю однорядних файлів. Класичний дизайн Unix полягає в тому, що більшість комунальних служб працюють *.txtбез потреби cat. catпризначено для згладжування декількох файлів в один потік.
Пітер Кордес

@PeterCordes Я не писав так багато лише про grep. Є суттєві проблеми, які я спостерігав щодо надійності помилок / копіювання-вставки; правильність та працездатність, яку ви зручно ігнорувати на користь якоїсь дрібної / периферійної проблеми.
randomstring

Ви робите кілька цікавих і достовірних моментів, особливо щодо помилок, які ви можете отримати при копіюванні / вставці конвеєрів. Я б запропонував замінити ваш grepприклад на таку програму cut, яка не має жодних причин піклуватися про декілька файлів, і її завжди можна було б подавати з її stdin. Деякі утиліти, як-от tr, взагалі не приймають аргументи файлів і працюють лише як фільтр, тому вибір залежить від catта <.
Пітер Кордес

1
Моя найбільша проблема вашої публікації полягає в тому, що ви знижуєте перенаправлення вводу. <file cmd1 | cmd2 >outце не чудово, визнаю, але до нього цілком можна звикнути. Ви продовжуєте глузливо говорити про "дух всемогутнього Unix", який для мене абсолютно не відповідає, бо це звучить так, що ви або не отримуєте, або не хочете отримати так, як думали дизайнери Unix. Це добре, якщо вам не подобається дизайн Unix, але він не є по суті німим. Я не впевнений, чи дизайн ОС передував синтаксису оболонки, і як це все розвивалося, але зайвого catв 1970 році варто було уникати!
Пітер Кордес

1
@PeterCordes В огляді я був досить завзятим у своїй відповіді, що відволікає найважливіший момент - правильність першого, оптимізація друга. Додатково catдопомагає повторно використовувати та сплайсувати трубопроводи, тоді як без цього ви можете отримати тихі відмови (шукайте "мовчки" у моїй відповіді).
randomstring

2

На захист марних застосувань Кіт

(Кілька абзаців, які допоможуть врівноважити цунамі нудотних коментарів проти цієї практики)

Я використовую bash занадто багато років і як оболонку, і як мову сценаріїв для невеликих сценаріїв (а іноді і з жалем для не дуже малих). Давно-давно я дізнався про "Марне використання кота" (UUoC). Я все ще винен у цьому щонайменше щотижня, але, чесно кажучи, рідко відчуваю себе навіть крихітним шматочком, змушеним уникати цього. Я вважаю, що використання catvs < file- це скоріше смак, ніж технічні відмінності, і я написав цю відповідь, щоб захистити нових людей в Linux, які поділяють мій смакcatвід думки, що в їхньому шляху щось серйозно не так (і відзначте кілька випадків, коли вони є). Як і Лінус Торвальдс, я також вважаю, що часто смак важливіший за майстерність. Це не означає, що мій смак кращий за ваш, але це означає, що якщо щось буде погано на смак, я не зроблю цього, не здобувши щось гідне.

Вже очевидно, що, як автор запитання, я вважаю, що використовувати cat дуже природно, коли працюю над REPL, як bash, де я досліджую проблему, поступово будуючи складні команди. Ось дуже типовий приклад: у мене є текстовий файл, і я не знаю багато про нього. Я наберу, cat fileщоб отримати смак вмісту. Якщо вихід занадто багато я вдарив стрілок вгору і в залежності від обставин , я додам | headабо | grep fooабо | what_everрозширюючи свою попередню команду, додавши обробку кроків. Цей спосіб поступово переходить від простої команди до більш складної, додаючи один крок обробки за іншим, мені здається дуже природним (я роблю те саме на ipython, і мені подобається спосібpyfunctionalі подібні засоби програмування охоплюють цей стиль). Тож, працюючи над шкаралупою баша, я впевнений, що переривання мого потоку для видалення catє більш марним, ніж дозволяти, і страждати ... ну ніяких наслідків у 99,9% випадків немає.

Звичайно, коли писати сценарії, все може змінитися. Але навіть коли пишуть сценарії, я вважаю, що люди, які знущаються над UUoC, чудово розуміють ці важливі уроки: "Передчасна оптимізація - корінь усього зла" . І якщо ви не робите чогось нетипового, UUoC дійсно важко бути місцем, де потрібна буде оптимізація. Звичайно, ви, безумовно, повинні знати, що в цьому неефективне (це додаткове виклик процесу BTW, оскільки мало хто, як це згадує) Маючи ці знання, якщо вам трапляється працювати в тих рідкісних системах, де виклик процесу є дорогим (наприклад, деякі вбудовані системи або менша ступінь CygWin), ви знатимете, що робити, якщо цього вимагає особлива ситуація. Наприклад, якщо ви виявите, що телефонуєтеcatбагато разів на секунду в циклі (BTW, якщо ви опинилися в такому положенні, запитайте себе, чи є bash правильним інструментом для роботи). Знову ж таки: "спочатку змусьте його правильно працювати, потім оптимізуйте його, якщо це необхідно" .

І як ви пояснюєте цунамі скарг на UUoC Nick?

Окрім того, що не всі мають мій смак, я вважаю, що основна частина того, чому так багато людей скаржаться на UUoC, не технічна, а людська: Більшість новачків Unix не дізнаються про < file commandідіому, тому більш досвідченій людині спокушати грати у "Старого Гуру" " їм. Він також матиме можливість використовувати вигадливі слова ("виклик процесу") та торкнутися дорогої теми "оптимізації". Гарне враження гарантується, тому протистояти дуже важко. Тоді прибульці приймуть поради Гуру за номінальною вартістю і надовго відтворюватимуть його як "Єдину Істину" (і голосуйте за цю відповідь :-). Смішна примітка: напевно, так легко виправити баш, щоб уникнути неефективності UUoC, що потрібно дивуватися, чому ніхто не додав цю функцію чи зробив< filenameкотячий файл після стількох років. Темна душа підказала б, що деякі хакери з сірою бородою люблять залишати можливості знущатися над нами ;-)


+1 Полюбіть останній параграф про те, чому антропологічні чинники, які поширюють цю практику :-)
randomstring

1

Що б було насправді приємно - це оболонка, яка підтримує синтаксис, наприклад:

< filename cmd | cmd2 cmd2arg1... | cmd3

Тим часом, я думаю, що cat filename | realcmd1...це прийнятно, оскільки він зберігає синтаксис, стандартизований за допомогою початкових команд, які вимагають імені файлу як аргументу.


17
Баш та подібні оболонки підтримують < filename cmd | cmd2 .... Це досить близько?
garyjohn

@garyjohn: Я думаю, ви повинні опублікувати це як відповідь.
Кевін Рейд

14
Обов’язковий старий коментар хакера: снаряди в стилі Борна підтримували < file command ...щонайменше середину 80-х і, мабуть, аж до 70-х років, коли shбув написаний оригінал . Більш загально, переадресації вводу / виводу аналізуються зліва направо і можуть бути перемежовані в будь-якому порядку в командному рядку. Отже, cmd <file arg arg...також було б дійсно.
Дейл Хагглунд

3
Так, це частково через те, як легко набрати те, що я винайшов UUOC.
Рандал Шварц

2
Один зміщений персонаж проти чотирьох не змінених - це не така велика різниця, і я б швидше породив додатковий процес, який навіть мій телефон ледве помічає, ніж передає файл у мій підказку, що дає мені головний біль щоразу, коли я його бачу .
Аарон Міллер

0

Для всіх, хто каже, що кішку прийнятно використовувати, оскільки вона "краще пахне" або "читабельніша", я сказав би лише це:

Можливо, вам ... але не іншим, хто може прочитати чи спробувати зрозуміти ваш код. Якщо ви ніколи не спробуєте навчити інших своїми прикладами чи ділитися своїм кодом, то будь-ласка будь ласка, використовуйте його у власний дозвілля.

Я також додаю цей коментар, оскільки давно користувач Linux та адміністратор / інженер ... (а нас багато), це робить наші очі кровоточивими, щоб побачити це. Чому? Тому що він використовує ресурси в системах, за якими ми жорстко контролюємо ресурси. Команда cat та сама труба використовують додаткові ручки пам'яті та файлів, які є абсолютно марними. Ви зв'язали ресурси, які потрібні моїй системі безкоштовно, і ви отримали НІЧЕ, що може пояснити використання цих ресурсів. Це величезне ні - ні.

Тепер я можу сидіти тут і обговорювати цілий день, як запах коду або читабельність цілий день з ким завгодно, але наприкінці дня це питання запису чи неправильності, і будь-коли ви використовуєте ресурси в системі та нічого не отримуєте для цього ... це неправильно

Як домашній користувач, ви можете дізнатися з моїх порад і навчитися кращим способам робити речі, або ви можете вибрати, щоб бути засліпленими "запахом" котів, вашим вибором ... але знайте, що якщо ви відкрито користуєтеся цією практикою, вас покличуть на цій практиці весь час, і ви мовчки повинні будете визнати, що вони праві, і ви вперті, бо це правда. :-)


Я також давно користувач Linux (і раніше * nix) і розробник програмного забезпечення. Ви не говорите для мене, коли ви говорите, "це робить наші очі кровоточать", щоб бачити cat foo.txt | .... Інша відповідь добре пояснить, чому це може бути корисним використанням. Простий підсумок справи на користь: "$ CPU time << $ Brain time" (як @MikeP коментував вище).
Jim DeLaHunt

По-перше, це була відповідь від 2017 року (спосіб відродити мертвого лол). По-друге, зауважте, що як адміністратор або розробник ми завжди повинні прагнути мінімізувати використання ресурсів, де це можливо. Коли ви пишете додатки та сервіси, ви намагаєтесь спостерігати за витратами пам’яті чи процесора, які пропонують мало користі для додатка / послуги, правильно? Ну, UUOC - це саме те. Тепер є цілком правильні способи використання кота, я впевнений, що це стосується трубопроводів для команди ... просто не часто. Тому я не можу говорити за вас, як ви кажете ... але якщо ви професіонал, я б задумався, чому ви не готові згодні (з урахуванням справжнього сценарію УУП).
Девід Дреггорс

Проблема полягає в тому, що витрата пам'яті або процесора - не єдина вартість, яку розробник може оптимізувати. Вартість людського часу, щоб зрозуміти проблему, написати та налагодити виконання, також є частиною компромісу. Деякі відповіді тут базуються на судженнях про те, що людський час набагато дефіцитніший і дорожчий, ніж пам'ять або процесор. . … Але це стає дискусією, яка суперечить правилам. Нехай голоси за відповіді говорять, яку перспективу схвалюють Супер Користувачі.
Jim DeLaHunt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.