Чи стає управління пам'яттю в програмуванні неактуальним питанням?


38

Передісторія
Я переглянув старий (але чудовий) сайт, на якому я не був віками, - перестрілку з мовою Alioth ( http://benchmarksgame.alioth.debian.org/ ).

Я почав програмувати на C / C ++ кілька років тому, але з тих пір працював майже виключно на Java через мовні обмеження в проектах, в яких я брав участь. Не пам’ятаючи цифр, я хотів приблизно побачити, наскільки добре Java провадився проти C / C ++ з точки зору використання ресурсів.

Терміни виконання були все ще відносно хорошими: Java в гіршому випадку працює в 4 рази повільніше, ніж C / C ++, але в середньому приблизно (або нижче) в 2 рази. Через характер впровадження самої Java це не здивувало, і час її виконання був фактично меншим, ніж я очікував.

Справжньою цеглою було розподіл пам'яті - в гіршому випадку, Java виділила:

  • колосальне на 52 рази більше пам'яті, ніж на C
  • і на 25 разів більше, ніж C ++.

52x пам’ять ... Абсолютно неприємно, правда? ... або це? Пам'ять зараз порівняно дешева.

Питання:
Якщо ми не розмовляємо з точки зору цільових платформ із суворими обмеженнями робочої пам’яті (наприклад, вбудованими системами тощо), чи варто використовувати пам'ять, коли б вибирали мову загального призначення сьогодні?

Я частково прошу, тому що я розглядаю міграцію до Скали як свою основну мову. Мені дуже подобаються функціональні аспекти, але з того, що я бачу, це навіть дорожче з точки зору пам'яті, ніж Java. Однак, оскільки пам'ять, як видається, стає щороку швидшою, дешевшою та ряснішою (здається, що споживчий ноутбук без принаймні 4 ГБ оперативної пам’яті DDR3 стає все важче), чи не можна стверджувати, що управління ресурсами стає все більше не має значення в порівнянні з (можливо, дорого реалізованими) мовними функціями високого рівня, які дозволяють швидше побудувати більш читабельні рішення?


32
Не забувайте, що лише тому, що Java виділяє на 52 рази більше пам’яті, ніж C, для невеликого орієнтиру, це не означає, що вона буде використовувати 52 рази більше пам’яті для великого додатка. Левова частка цієї пам’яті становитиме фіксовану кількість, необхідну JVM, і чим більша буде ваша програма, тим менш вагомою буде ця частина.
Carson63000

4
Якщо мобільний розвиток не має значення, то так.
JeffO

3
Питання в тому, наскільки поганий показник Java порівняно з C / C ++ і що це означає у виборі між двома мовами. Я вважаю це тематичним, актуальним для всіх програмістів, чітким, цілеспрямованим та здатним відповісти обґрунтовано в його теперішній формі. Я проголосував за повторне відкриття.
GlenPeterson

Більшість проблем із продуктивністю спричиняються та виправляються на рівні проектування, а не на рівні інструменту. Деяким проблемам потрібна деталізація 1 мс, і тому потрібна C / C ++. Якщо у вас є вільний простір, як 10 мс, то, можливо, Scala або Java - хороший варіант. Більшість вхідних контролерів для ігор працюють на рівні 50-100 мс. Сьогодні багато людей пишуть критичні розділи однією мовою, а решту програми - іншою.
GlenPeterson

4
Переглядаючи "25x більше C ++" у цьому тесті, потрібно враховувати постійне додавання часу виконання (близько 13 Мб). По мірі того, як проблема стає більшою, потреба в пам’яті для виконання стає меншою у відсотках від усієї програми. Якщо використання пам'яті C ++ менше 1 Мб, якщо відняти використання пам'яті C ++ від використання пам'яті Java, ви отримаєте досить постійне значення.

Відповіді:


34

Управління пам'яттю надзвичайно актуально, оскільки воно регулює, наскільки швидко щось з’являється, навіть якщо щось має велику кількість пам'яті. Найкращий і найбільш канонічний приклад - такі ігри з назвою AAA, як Call of Duty або Bioshock. Це ефективні додатки в режимі реального часу, які потребують великих обсягів контролю з точки зору оптимізації та використання. Справа не у використанні як такому, а в управлінні.

Зводиться до двох слів: Збір сміття. Алгоритми збору сміття можуть спричинити незначні ікоти у роботі або навіть призвести до того, що програма зависла на секунду-дві. Здебільшого нешкідливі у програмі бухгалтерського обліку, але потенційно руйнівні з точки зору досвіду користувачів у грі Call of Duty. Таким чином, у програмах, де важливий час, зібрані сміття мови можуть бути дуже проблематичними. Наприклад, це одна з цілей дизайну Білки, яка прагне вирішити проблему, яку має Lua зі своїм GC, використовуючи замість цього підрахунок посилань.

Це більше головний біль? Звичайно, але якщо вам потрібен точний контроль, ви змирилися з ним.


14
-1 "... буквально смертельно небезпечно в грі ..." - Моя щоденна робота - це система, що належить до безпеки, як для безпеки життя. Найгірше, що трапляється в ігровому програмному забезпеченні, - це те, що автор пихається, тому що його шалено і ніхто не купує. Це відмінність, яку не варто дорікати.
mattnz

4
@mattnz Неправильний вибір слів з мого боку. Це було виправлено. Мені не було наміру щось тривілізувати.
Світовий інженер

19
@Mattnz: Якщо ви знайомі з іграми, він, очевидно, означає, що це може бути смертельним для вашого персонажа , що є цілком правдивим твердженням.
Мейсон Вілер

8
+1, оскільки у відповідача є діамант, тому відповідь повинна бути правильною.
psr

8
Колектори для сміття в реальному часі існують століттями.
Йорг W Міттаг

30

Справжньою цеглою було розподіл пам’яті - в гіршому випадку Java виділила колосально на 52 рази більше пам'яті, ніж на C, і на 25 разів більше, ніж на C ++.

Ви розумієте, на яких числах ви базуєте своє запитання?

  • Скільки було виділено пам’яті?
  • Що робили програми?

Коли між цими програмами Java і C є велика невідповідність, це в основному розподіл пам'яті JVM за замовчуванням порівняно з необхідними libc:

  • n-body
    Java-програма 13,996KB :: Програма C 320KB :: Безкоштовний Pascal 8KB

Подивіться на завдання, для яких потрібно виділити пам'ять (або використовувати додаткові буфери для накопичення результатів з багатоядерних програм):

  • Мандельброт
    Java програма 67 , 880 КБ :: C програма 30 , 444 КБ

  • k-нуклеотидна
    програма Java 494 , 040KB :: програма C 153 , 452KB


  • програма Java зі зворотним доповненням 511 , 484KB :: C програма 248 , 632KB

  • програма regex-dna
    Java 557 , 080KB :: C програма 289 , 088KB

  • двійкові дерева-
    програми Java 506 , 592KB :: Програма C 99 , 448KB

... чи повинно бути проблемою використання пам'яті при виборі мови загального призначення сьогодні?

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


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

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

17

Як і у всіх речах, це компроміс.

Якщо ви будуєте додаток, який запускається на одному робочому столі користувача, і, по суті, можна очікувати, що він керує великою частиною оперативної пам’яті на цій машині, можливо, варто пожертвувати використанням пам'яті для швидкості впровадження. Якщо ви орієнтуєтесь на той самий апарат, але ви створюєте невелику утиліту, яка збирається конкурувати з низкою інших програм, що голодують на пам’ять, які працюють одночасно, можливо, ви хочете бути обережнішими щодо цього компромісу. Користувач може гаразд із грою, яка бажає всієї пам’яті під час запуску (хоча, як вказує World Engineer, вони ' Буду занепокоєний, якщо сміттєзбірник вирішить періодично призупиняти дію, щоб зробити підмітку) - вони, швидше за все, будуть набагато менше захоплені, якщо музичний плеєр, який вони працюють у фоновому режимі, виконуючи інші речі, вирішить пограбувати тонну пам'яті та заважає їх працездатності. Якщо ви створюєте веб-додаток, будь-яка пам'ять, яку ви використовуєте на серверах, обмежує вашу можливість масштабування, змушуючи витрачати більше грошей на більше серверах додатків, щоб підтримувати той самий набір користувачів. Це може мати великий вплив на економіку компанії, тому ви, можливо, захочете бути дуже обережними щодо здійснення цього компромісу. будь-яка пам'ять, яку ви використовуєте на серверах, обмежує вашу можливість масштабування, змушуючи витрачати більше грошей на більше серверах додатків, щоб підтримувати той самий набір користувачів. Це може мати великий вплив на економіку компанії, тому ви, можливо, захочете бути дуже обережними щодо здійснення цього компромісу. будь-яка пам'ять, яку ви використовуєте на серверах, обмежує вашу можливість масштабування, змушуючи витрачати більше грошей на більше серверах додатків, щоб підтримувати той самий набір користувачів. Це може мати великий вплив на економіку компанії, тому ви, можливо, захочете бути дуже обережними щодо здійснення цього компромісу.


8

Це залежить від ряду факторів, особливо від масштабу, в якому ви працюєте.

Тільки заради аргументу, припустимо, 30-кратну різницю пам’яті та 2 рази у використанні процесора.

Якщо ви маєте справу з інтерактивною програмою, яка б займала 10 мегабайт пам'яті та 1 мілісекунд центрального процесора, якщо вона написана на мові C, це набагато несуттєво - 300 мегабайт пам'яті та 2 мілісекунди для виконання, як правило, абсолютно не мають значення на типовому робочому столі, і навряд чи значить багато чого навіть на телефоні чи планшеті.

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

Інший фактор, який вам дійсно потрібно врахувати - це саме те, скільки різниці у вартості розробки ви збираєтеся побачити для своєї конкретної задачі. Зараз ви в основному дивитесь на одну сторону рівняння. Щоб отримати гарне уявлення про витрати порівняно з вигодами, вам (очевидно, достатньо) потрібно дивитись як на витрати, так і на вигоди, а не лише на одиницю. Справжнє питання в основному: "чи х більший за у?" - але ви не можете цього визначити, дивлячись лише на х. Ви також чітко повинні дивитися на y.


2
+1 за відмітку масштабу. Погляньте на цю статтю, щоб дійсно оцінити управління ресурсами у великих масштабах.
Гай Кодер

6

Управління пам'яттю абсолютно актуально в сучасному світі. Однак не так, як ви могли очікувати. Навіть у мовах, зібраних зі сміттям, ви повинні переконатися, що у вас немає витоку посилання

Ви робите щось не так, якщо це ваш код:

static List<string> Cache;

...
Cache.Add(foo); //and then never remove anything from Cache

Збір сміття не може магічно знати, що ви ніколи більше не використовуєте посилання, якщо ви не зробите це, щоб ви більше не могли його використовувати, тобто, роблячи це Cache=null, ви ефективно попереджуєте сміттєзбірника про те, що "ага, я не зможу отримуйте доступ до нього більше. Робіть, що з цим будете "

Це складніше, ніж це, але посилання на витоки настільки ж шкідливі, як не більше, ніж традиційні витоки пам'яті.

Є також місця, де ви не можете помістити сміттєзбірник. Наприклад, ATTiny84 є мікроконтролером з 512 байтами кодового ПЗУ та 32 байтами ОЗУ. Удачі! Це крайність, і, ймовірно, не було б запрограмовано нічим, крім складання, але все ж. В інших випадках у вас може бути пам'ять 1М. Звичайно, ви можете помістити сміттєзбірник, але якщо процесор дуже повільний (або за обмеженнями, або для збереження акумулятора), ви не збираєтесь використовувати сміттєзбірник, оскільки це занадто дорого відстежувати, що може знати програміст .

Також стає значно складніше використовувати збір сміття, коли вам потрібен гарантований час реагування. Наприклад, якщо у вас є серцевий монітор або щось таке, і коли він отримує 1сигнал на якомусь порті, вам потрібно гарантувати, що ви зможете відповісти на нього правильним сигналом або чимось протягом 10 мс. Якщо посеред вашого режиму реагування на смітники потрібно зробити пропуск, і в кінці кінця знадобиться 100 м для відповіді, це може бути хтось мертвий. Збір сміття дуже важко, якщо не неможливо, використовувати, коли потрібно гарантувати терміни.

І звичайно, навіть на сучасному обладнанні є деякі випадки, коли вам потрібні додаткові 2% продуктивності, не турбуючись про витрати на сміттєзбірник.


3

Як сказав Дональд Кнут, передчасна оптимізація є коренем усього зла. Якщо у вас немає підстав вважати, що пам'ять стане вузьким місцем, не хвилюйтеся про це. А враховуючи, що закон Мура все ще забезпечує збільшення ємності пам'яті (навіть якщо ми не отримуємо з неї швидше однопотокового коду), є всі підстави вважати, що в майбутньому ми будемо ще менше обмежені пам’яттю, ніж ми є сьогодні.

Але це означає, що якщо оптимізація не передчасна, будь ласка, зробіть це. Я особисто працюю над проектом саме зараз, де дуже детально розумію використання пам’яті, мені фактично потрібен точний контроль, і сміттєзмістка мене вб’є. Тому я роблю цей проект на C ++. Але цей вибір, здається, для мене відбувається раз на кілька років. (Сподіваюся, через кілька тижнів я більше не торкаюся C ++ ще кілька років.)


4
Таке ставлення полягає в тому, як ми закінчуємо роздуте корпоративне програмне забезпечення на неймовірно повільних комп’ютерах, які продовжують пейджингові. Всі кажуть: "Звичайно, мій додаток займає більше пам’яті, але кому це все одно, це практично безкоштовно!" і тоді ви закінчите повний стек голодних пам’яток додатків, які роблять оперативну пам’ять на 4 Гб оперативно повільніше, ніж 512 МБ оперативної пам’яті 10 років тому.
MrFox

@MrFox Насправді проблема з корпоративним програмним забезпеченням полягає в тому, що люди, які вирішили його використовувати, - це не люди, які страждають цим. Див. List.canonical.org/pipermail/kragen-tol/2005-April/000772.html для чудового опису того, чому воно порушено. Щодо решти, чи не пропустили ви мою вказівку, що турбуватися про використання пам'яті іноді потрібно?
btilly

3

Для людей, які займаються "великими даними", управління пам'яттю все ще залишається величезною проблемою. Програми з астрономії, фізики, біоінформатики, машинного навчання тощо повинні мати справу з багатогігабайтними наборами даних, і програми працюють набагато швидше, якщо відповідні частини можуть зберігатися в пам'яті. Навіть робота на машині з 128 ГБ оперативної пам’яті не вирішує проблему.

Існує також питання скористатися графічним процесором, хоча, можливо, ви його класифікуєте як вбудовану систему. Більшість роздумів щодо використання CUDA або OpenCL зводиться до проблем управління пам'яттю при передачі даних з основної пам'яті в пам'ять GPU.


1

Справедливо кажучи, багато Java там балується деякими справді і безглуздо класово-вибуховими моделями, які просто вбивають продуктивність і пам’яті свиней, але мені цікаво, наскільки ця пам’ять - це просто JVM. те саме додаток у декількох середовищах без необхідності повністю переписувати нові. Звідси питання дизайнерського компромісу все зводиться до: "Скільки вашої пам'яті користувачів вартує такої переваги розвитку?"

Це IMO - цілком доцільне та обґрунтоване рішення. Що мене здивує, це те, що, оскільки сучасні ПК настільки потужні, а пам’ять така дешева, ми можемо повністю ігнорувати подібні проблеми та функції розмивання та розмивання коду та лінуватися щодо вибору до того моменту, як здається, що це багато чого Зараз я працюю на комп'ютері з Windows, займає стільки ж, скільки й у Window '95. Серйозно, правда, Слово? Скільки нового лайно, яке насправді потребує 80% їх бази користувачів, вони могли б додати за 18 років? Досить впевнений, у нас були перевірки орфографії, попередньо вірно? Але ми говорили про пам’ять, яка не обов'язково швидкість, якщо її у вас є багато, тож я відволікаюся.

Але, звичайно, якщо ви можете зробити додаток за два тижні ціною, можливо, кількома зайвими мегабайт, а не за два роки, щоб отримати версію "лише кілька-K" для потреб, варто врахувати, як порівнюється кілька мегабайт ( Я здогадуюсь) 4–12 гігів на машині середнього користувача, перш ніж насміхатися з ідеєю бути такою неохайною.

Але що це стосується Scala поза питанням компромісу? Тільки тому, що це збирання сміття, не означає, що ви не завжди повинні намагатися замислюватися над потоком даних з точки зору того, що входить у сферу застосування та закриття, і чи варто залишати його сидіти чи використовувати його таким чином, щоб це було розміщена GC тоді, коли вона більше не потрібна. Це щось навіть нам, веб-розробникам JavaScript у користувальницькому інтерфейсі, треба було подумати, і, сподіваємось, будемо продовжувати, коли ми поширюватимемось на інші проблемні домени, наприклад, рак, що спричиняє парфуми (що ви всі повинні були вбити Flash або Applets або щось, коли у вас була можливість) що ми.


0

Чи стає управління пам'яттю в програмуванні неактуальним питанням?

Управління пам'яттю (або управлінням) - це фактично головна причина, що я використовую C і C ++.

Пам'ять зараз порівняно дешева.

Не швидка пам'ять. Ми все ще дивимося на невелику кількість регістрів, щось на зразок кеш даних 32 КБ для L1 на i7, 256 Кб для L2 та 2 МБ для L3 / core. Це сказав:

Якщо ми не розмовляємо з точки зору цільових платформ із суворими обмеженнями робочої пам'яті (наприклад, вбудованими системами тощо), чи має використання пам'яті викликати занепокоєння при виборі мови загального призначення сьогодні?

Використання пам'яті на загальному рівні, можливо, ні. Мені трохи непрактично в тому, що мені не подобається ідея блокнота, який займає, скажімо, 50 мегабайт DRAM і сотні мегабайт місця на жорсткому диску, хоча я маю на цьому запас і багато іншого. Я був довгий час, і мені просто здається дивним і люб'язним, коли я бачу, що таке просте додаток має відносно стільки пам’яті для того, що потрібно зробити з кілобайтами. Це означає, що я міг би жити сам із собою, якби зіткнувся з такою річчю, якби все-таки було приємно і чуйно.

Причиною, що для мене важливе управління пам’яттю в моїй галузі, не полягає в тому, щоб в цілому зменшити використання пам'яті. Сотні мегабайт використання пам’яті не обов'язково сповільнюватимуть додаток будь-яким нетривіальним способом, якщо жодна з цієї пам’яті часто не доступна (наприклад, лише після натискання кнопки чи іншої форми введення користувача, що вкрай рідко, якщо ви говорять про корейських гравців Starcraft, які можуть натиснути кнопку мільйон разів на секунду).

Причина, яка є важливою в моєму полі, полягає в тому, щоб щільно пам’ятати і зближувати пам’ять , до якої дуже часто звертаються (наприклад, перекидаються на кожен кадр) на цих критичних шляхах. Ми не хочемо втрачати кеш-пам'ять кожного разу, коли ми отримуємо доступ до лише одного з мільйона елементів, до якого потрібно отримати доступ у циклі кожен кадр. Коли ми переміщаємо пам’ять вниз по ієрархії від повільної пам'яті до швидкої пам’яті великими фрагментами, скажімо, 64-байтними кеш-лініями, це дуже корисно, якщо всі 64 байти містять відповідні дані, якщо ми можемо вмістити кілька елементів, варті даних у ці 64 байти, і якщо наші схеми доступу такі, що ми використовуємо їх до вилучення даних.

Ці часто доступні дані для мільйона елементів можуть охоплювати лише 20 мегабайт, навіть якщо ми маємо гігабайти. Він все ще робить різницю у швидкості кадрів, циркулюючи над цими даними кожен окремий кадр, намальований, якщо пам'ять є тісною і зближеною, щоб мінімізувати пропуски кешу, і саме тут управління / контроль пам'яті настільки корисний. Простий наочний приклад сфери з кількома мільйонами вершин:

введіть тут опис зображення

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

Протягом останніх кількох десятиліть я розробляв та впроваджував ряд сітчастих систем, і їх швидкість часто була дуже пропорційною їх використанню пам'яті. Незважаючи на те, що я працюю з цим, набагато більше пам’яті, ніж коли я почав, мої нові сітчасті системи в 10 разів швидше, ніж моя перша конструкція (майже 20 років тому), і значною мірою, оскільки вони використовують близько 1/10 пам'ять. Найновіша версія навіть використовує індексовану компресію, щоб скомпонувати якомога більше даних, і, незважаючи на обробку накладних витрат на декомпресію, стиснення насправді покращило продуктивність, оскільки, знову ж таки, у нас так мало дорогої швидкої пам'яті. Зараз я можу вмістити мільйон багатокутних сіток з текстурними координатами, складанням країв, призначенням матеріалів тощо, а також просторовим індексом для цього приблизно в 30 мегабайт.

Ось змінний прототип з понад 8 мільйонами чотирикутників і схемою підрозділу з декількома схемами на i3 з GF 8400 (це було з декількох років тому). Це швидше, ніж моя незмінна версія, але не використовується у виробництві, оскільки я знайшов незмінну версію настільки простішою в обслуговуванні, а показник продуктивності не надто поганий. Зауважте, що каркас не вказує фасети, а патчі (дроти - це фактично криві, інакше вся сітка буде суцільною чорною), хоча всі точки у фасеті змінені пензлем.

введіть тут опис зображення

Так що все одно, я просто хотів показати дещо з цього вище, щоб показати конкретні приклади та сфери, де управління пам’яттю настільки корисне, а також, сподіваємось, тому люди не думають, що я просто розмовляю з мого прикладу. Я, як правило, трохи дратується, коли люди кажуть, що пам'ять настільки велика і дешева, тому що це говорить про повільну пам'ять, як DRAM і жорсткі диски. Він все ще такий маленький і такий дорогоцінний, коли ми говоримо про швидку пам’ять, а продуктивність для справді критичних (тобто загальних випадків, не для всіх) шляхів стосується відтворення цього невеликого обсягу швидкої пам'яті та використання його настільки ефективно, наскільки ми можемо .

Для подібних речей дуже корисно працювати з мовою, яка дозволяє, наприклад, проектувати об'єкти високого рівня, такі як C ++, при цьому зберігаючи ці об’єкти в одному або декількох суміжних масивах із гарантією, що пам'ять про всі такі об'єкти будуть суцільно представлені і без зайвих накладних пам'яті на один об'єкт (наприклад, не всі об'єкти потребують рефлексії або віртуальної розсилки). Коли ви фактично переходите в ці найважливіші області продуктивності, це насправді стає підвищенням продуктивності, щоб мати такий контроль пам’яті над, скажімо, змішуванням з об'єктами об'єктів та використанням примітивних типів даних, щоб уникнути накладних витрат об’єктів, витрат на GC та зберегти часто доступ до пам’яті. разом суміжні.

Тож управління / контроль пам'яті (або її відсутність) є фактично домінуючою причиною в моєму випадку вибору мови, яка найбільш продуктивно дозволяє мені вирішувати проблеми. Я точно пишу свою частку коду, який не є критичним для продуктивності, і для цього я схильний використовувати Lua, який досить легко вставити з C.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.