|
Почему они будут работать быстрееСергей Парунов Почитал я недавно статью CyberManiac "Почему они никогда не будут работать быстрее" в IZone. И стало мне грустно. Уж такое "охаивание и огуивание" всего и вся, связанного с нынешними технологиями, просто неуместно для человека, который на этих технологиях зарабатывает (ведь не дворником же он работает?). Вот я и понесу по кочкам некоторые положения этого, несомненно, впечатляющего труда.
Избыточность?Безусловно, тенденции подмечены верно. Действительно, бритва Оккама редко бреет создателей всё новых и новых перлов технического прогресса. Да, избыточность современных технологий просто потрясает. Да, при просмотре, например, кода, созданного современными программистами и системами программирования, бывает, хочется рыдать и садиться за ассемблер - до 80% "библиотечного" мусора тому причина. Но истолкование! Перфекционизм (стремление к наилучшему любой ценой) - не идеальный взгляд на мир. Он не идеален, поскольку в общем невыгоден для его носителя. Вот многие из вас видели последние 10 лет прогресса по крайней мере в области ПК. Ну и как Вам снижение цен на эти программно-аппаратные комплексы на порядок за это время? А ведь возможности-то возросли даже в большее число раз! Ведь большинство из нас не засадишь не то что за XT, даже 386 будет слабоват. Даже если писать под него исключительно на ассемблере и по самым-рассамым алгоритмам. 20 лет назад супер-ЭВМ не обладали производительностью средней нынешней персоналки! Что для этой персоналки "неэффективность кода" в 5 раз? Ничего! Ну представьте, человек сядет и будет гробиться через ассемблер 2 года, создавая программу, которую может написать на ЯВУ за четыре месяца. И через эти 2 года выходит из кельи и видит: конкурент написал то же на ЯВУ и съездил в кругосветку. А преимущества-то у него никакого нет - машины добавили 400% производительности, и как его, так и конкурента программы работают! Вы скажете "А всё-таки у него быстрее!". Да, работа с его продуктом будет приятнее, легче. До первого зависания. До первой необходимости срочной переделки под изменившиеся стандарты. А тогда Вы ему не позавидуете. Ведь хотя ошибки на Ассемблере могут возникать не чаще, чем у пишущих на ЯВУ (просто синтаксис и приёмы въедаются намертво), выяснение причины, по которой продукт глючит (отладка) на этих вещах - совершенно разные вещи, простите за тавтологию! Модификация кода - дело, по трудоёмкости обратно пропорциональное "уровню" языка, на котором он написан. Лишняя совместимость?Насчёт текстовых режимов и прочего скажу сразу - не лишено смысла. Хотя как можно себе представить ПК с 32-разрядными БИОС и загрузчиком операционной системы (и сколько эта переделка стоила бы) - сказать не берусь. А вот на AMD уважаемый CyberManiac грешит зря. Неправильно это, нехорошо. Как выполнена поддержка 16-разрядного кода на современных процессорах? Побочным путём. Все эти режимы совместимости не вносят задержек и помех при работе в основных режимах. AMD сама признаёт - производительность её новых Hammer в 32-разрядном режиме существенно меньше, чем в основном 64-разрядном. Точно такая же ситуация, кстати, в Пентиум Про и последующих моделях Intel относительно 16- и 32-разрядных режимов. А представляя себе, что сейчас издержки на процессоры находятся в экспоненциальной зависимости от производительности (проще говоря, в 2 раза выше производительность - в 6 раз больше транзисторов), становится очевидно, что затраты на это невелики. Кроме того, основные вычислительные блоки там и там одни и те же - блок вычислений с плавающей запятой, например, применяется в тот же. Так что "Не паниковать, Джон, а доить, доить!" (из анекдота о чужой корове, забредшей в огород). Сейчас практически весь код 32-разрядный, и перенос его (НАДЁЖНЫЙ) на 64 бита лучше производить эволюционным путём. Так, как было в ОС семейства Windows 95 - если бы она не выполняла старые 16-бит программы, это было бы для неё огромным минусом, вспомните то время… "Гонка вооружений"?Теперь поговорим о серьёзном обвинении CyberManiac в адрес производителей железа. Они, дескать, договорились за нашими спинами, прямо как Сионские мудрецы, силой вытаскивать из наших карманов деньги за всё более и более крутые железяки. И самое обидное, дескать - то, что железяки эти дешевеют в два раза за год или около того. Ну никак не удержаться и не прикупить вот эту последнюю видеокарту! А нужна она не через полгода, а прямо сейчас. Как пишет CyberManiac: "Но почему тогда нельзя наращивать память на видеокартах стандартными модулями - ведь ни для кого не секрет, что чипы (если, конечно, не вспоминать древние времена) используются те же самые, что и для обычной оперативной памяти. Разумеется, производители видеочипов и видеокарт будут отрицать наличие злого умысла и утверждать, что от этого видеокарты будут стоить дороже…" Любой человек, разбирающийся в электронике, скажет, как и я - правы производители. Кроме того, поставив на GeForce2MX 128 МБ памяти, ничего Вы не получите, даже напрягаться не стоит. Начиная с определённого момента объём памяти на производительность видеокарт не влияет. А в самом ли деле ситуация столь мрачна? Ведь покупали Вы это железо для себя. Медленнее оно работать не стало. Интенсивность отказов у современной электроники весьма невелика. Так чего беспокоиться? Что такого вдруг с человеком должно приключиться, чтобы он непременно захотел поставить Windows XP, Office XP, Media Player 9 Beta2 и прочее, и прочее? И для этого ну обязательно нужен Атлон или Пентиум 4 (а это, кстати, не факт, главное - память машины)? Задумывается ли такой человек об избыточности ПО? Ему нужно всё. Смарт-теги (переводится как умные. Умнее Вас.) в Офисе (кстати, в Word они отъедают 50% ресурсов), чрезвычайно зрелищные эффекты в Проигрывателе (человек, ощущающий потребность смотреть на них более часа в неделю, сдаётся мне, серьёзно болен), скины в Windows XP? Нужно-то оно нужно, но вот парадокс - "чтобы было", ведь человек этим воспользуется и забудет. В силу ненужности или невозможности освоения всего этого материала за разумный период времени. Покажите мне человека, знающего Офис досконально - это либо преподаватель, либо профессионал в области оборота информации. "Простому человеку" даже Word 97 не покажется маломощным. Кстати, он свободно открывает файлы XP версии без больших потерь, и последний можно вообще настроить на совместимость с ним. Интересно, а Вы лично навскидку назовёте то, чего Вам в нём ну очень не хватало и что Вы обрели в 2002 году? Первое - ну конечно! А второе? Перешли ли Вы на Windows XP? Который кушает 256 мегабайт памяти? Сначала восторг, потом привычка, а теперь вовсе не замечаете этих рюшечек? И всего за неделю? Между прочим, производитель это знал заранее, не зря же профессионалы там работают… Так спрашивается, по какому поводу возмущение? Чего-то я не понимаю. Игрок - он и есть игрок, и если ему нужно - обязательно проапгрейдится. Купил "промежуточный товар", тот же GeForce4MX или Celeron? Так кто его тянул? Производитель игр или изготовитель железа ему ничего большего не обещали. Они сполна заработали свои деньги и хотят заработать ещё на более качественном товаре. А потребитель имеет то, за что заплатил. Кстати, про "умышленное ограничение функциональности ради пропихивания на рынок более дорогих моделей: про Intel с последними Celeron'ами и NVidia с заведомо устаревшими на момент выхода GeForce 4MX знают все." Извините, вот представьте на минутку: Вы - лидер рынка, затративший примерно поровну средств на разработку и изготовление продукта. И решили Вы продавать всё по одной, усреднённой, цене (а если продукты одинаковы, цена различаться не может в принципе). Что последует? Вас просто вытеснят из нижнего ценового сектора рынка те, кто на разработку и производство потратит меньше. Его продукт не потянет на чемпиона, но дешевизной задавит Вас. А в верхнем секторе Вы недополучите и не сможете там удержаться. Потому Вы и будете продавать дешёвые обрезанные модели и дорогие полнофункциональные, перекладывая в основном на цену последних затраты по разработке - как, собственно, и должно быть, и на что никто не должен обижаться! Лично я работаю под NT4 и не собираюсь переходить на всякие XP. И не потому, что компьютер слабый (PIII650, 256МБ). Просто я не особо играю в игры, а для всего остального NT - ого-го! Да видел я все эти XP. Сначала поражает быстрая загрузка и красивый интерфейс, а потом замечаешь - а король-то голый! Скорость загрузки - не показатель, показатель - работа, а работа почти одинаковая, ведь ядра этих операционок (Win2000, XP) - та же NT. Спросите любого программиста, много ли офонарительных возможностей появилось в XP… Хотя неподготовленному человеку всё же посоветую Win2000 - она требует меньше знаний. Не могу пройти мимо одного большого маразма Windows XP - по умолчанию она даёт приложениям, не учитывающим её капризов (таких пока большинство) только 80% пропускной способности каналов связи - в том числе и по удалённому доступу (модемом). Прелестно, не правда ли? Кстати, предложенный автором способ "разгона" программ под NT/2000/XP (а тем более в Linux ;) просто ничего не даст благодаря усовершенствованному диспетчеру задач - даже с обычным приоритетом приложение вполне может забрать в пользование 99% ресурсов, если ему надо. Так "какой злобный монстр, пожирающий ресурсы и отравляющий жизнь простого пользователя, прячется во всех этих мегабайтах?". Нет никакого монстра, это всё компьютерные психозы ;), есть неправильный выбор пользователя: "налево пойдешь - туда попадёшь…". Ведь выбор-то широк! Даже на 16 МБ памяти можно спокойно работать, не терзая себя комплексом буржуазной неполноценности ;) - смотря какие задачи Вы решаете. НаСИлие, которого не было.Ну вот. Вот и добрался до самой-самой темы. Итак, прав ли CyberManiac, говоря о чрезмерной усложнённости языка Си? О его универсальности, достигаемой посредством "навешивания блестящих фенечек" и приводящей к усложнённости и забитости языка? О "заговоре великих стандартизаторов"? Скажу сразу - да, в этом я с ним согласен. Стопроцентно! Язык Си - это не только самый универсальный, но и самый сложный язык, если сравнивать с Паскалем и Бейсиком. Но становится ли он от этого хуже настолько, что от него надо отказаться? Что его никому не надо изучать? Попрошу читателя разобраться в приводимом фрагменте кода, выводящего 1000 элементов массива символов на экран. Это несложно. Сначала на Паскале:
for I := 1 to 1000 do Это всё. Как видим, переменная I последовательно (в цикле for) принимает значения 1,2,…1000. При этих значениях оператором Write выводится на экран Array[I] - I-й элемент массива Array (символ). Всё просто и логично. Именно так говорят на уроках информатики в школе ;). А теперь давайте подумаем: что мы 1000 раз делаем? Выводим элемент массива по его индексу - числу от 1 до 1000. А что нам для этого надо? Надо 1000 раз найти, где в памяти находится I-й элемент. А как? А так: каждый раз мы берём известный адрес первого элемента массива (назовём его базой - он у нас под рукой, и именно по нему мы "видим" массив) и по нему считаем, прибавляя смещение относительно базы. А смещение найти просто: вычитаем из индекса (например, 3) индекс первого элемента (1) и умножаем на размер элемента массива (например, 6 байт). Получили 12 байт смещения, которые и надо прибавить к адресу первого элемента, чтобы получить адрес третьего. Некоторые уже сообразили: если взять в качестве базы "нулевой псевдоэлемент" (тут он "расположен на 6 байт ниже первого"), можно избежать вычитания. Не буду вдаваться в детали, но этого не делают по причине кое-каких сложностей. Никому не засветило? Это как же так - 1000 раз делать одну и ту же работу? Да Ада Лавлейс не одобрила бы ;). Но нет, именно так часто и делают - вычитание, умножение и сложение. Разумеется, если первый элемент нулевой, вычитание не производится (вот почему в Си массивы только с нулевым первым индексом!!!), и если размер элемента 1 байт, умножения тоже нет. А теперь Си:
char *P = Array; Что тут делается? Сначала переменная P, предназначенная для хранения адреса символа (отсюда и char *), ставится на первый символ массива (то есть в неё заносится адрес символа). Затем в операторе for объявляются начальное значение I, условие, при котором цикл будет продолжаться (I не равно 1000), и то, что делается для достижения этого условия при каждом выполнении тела цикла (а именно - уменьшение I каждый раз на 1). В цикле же выводится символ, на который указывает P (отсюда и * перед ним) в поток вывода, и приращивается P (мы же обходим массив?). Ну и как Вам различия? На первый раз громоздко. Но согласитесь, более универсальная конструкция. А CyberManiac прохаживается: "Первое место в рейтинге багов и глюков традиционно занимает buffer overrun или "ой, эта штука залезла в чужую память". Врожденный дефект языка, который более чем за 20 лет жизни не потрудился обзавестись динамическими массивами и потому вынуждает копаться в ячейках памяти напрямую. Больше того, любая активная работа с памятью "в стиле Си" рано или поздно кончается именно этим - и не важно, какой язык программирования при этом использовался" Ну что сказать… Действительно, в такой конструкции легче по ошибке залезть не только в массив, но и в рядом расположенные области памяти. Это цена эффективности, увы. Чтобы написать программу работы с бухгалтерией, выводящую красивые формы и отчёты, или проигрыватель музыки, основанный на чужом коде, пойдут почти все современные универсальные языки, и многие - да! - тут лучше Си. Но серьёзный и требующий быстроты алгоритм - извините. Кроме того, позволю себе заметить, что ЭТИМ заканчивается время от времени любая человеческая деятельность - от падения в гололёдицу (на четвереньках передвигаться давно не пробовали? А помогает!) до создания научных теорий. Одно исключение тут - философия, по определению состоящая из множества теорий, из которых верной может быть (если вообще есть такая) лишь одна. А бедных студентов гоняют по всем! ;( Немного утешу сторонников Паскаля и Бейсика: во-первых, при простых конструкциях типа вышеприведённого перечисления элементов массива компилятор генерирует оптимизированный код, основанный именно на принципах "активной работы с памятью", то есть адрес элемента массива не вычисляется непосредственно из индекса, а получается прибавлением размера элемента массива к адресу предыдущему элемента. Но это работает только до тех пор, пока мы не вычисляем индекс формулой. "Сишный" алгоритм реализуем в Паскале и явно - но часто более коряво, ведь язык не для этого предназначен (код при этом будет тот же. Компилятор, скажем, в Delphi и C++ Builder один, только синтаксические анализаторы разные). И чтобы закончить разговор на тему "чего нет в C++": в C++ с момента создания существуют стандартные классы и шаблоны типов, реализующие ВСЕ ЭТИ строки (содержащие свою длину!) и динамические массивы, и что-бы-господа-ни-пожелали ничуть не менее эффективно (!) и удобно, чем в Паскале. Средства этого языка позволяют оформить всё так, как будто мы имеем дело со встроенными типами - как с числами (я говорю о перегрузке операторов). А сколько там того, что "конкурентам" и не снилось! Вообще-то я не имею ничего против Delphi и Visual Basic. Когда требуется написать маленькую или среднюю программу (не более нескольких тысяч строк, то есть большинство), эти языки практически не уступают Си по эффективности, будучи более приспособленными для скоростной разработки кода. Но серьёзные вещи (игры, скажем, где быстродействие машины часто задействовано до предела, или моделирование, проектирование…) заставляют обращать внимание на "мелочи", на которые не повлиять в более простых языках.
|
Copyright © "Internet Zone", info@izcity.com Копирование и использование данных материалов разрешается только в случае указания на журнал "Internet Zone", как на источник получения информации. При этом во всех ссылках обязательно явное указание адреса вэб-сайта http://www.izcity.com/. При наличии у копируемого материала авторов и источника информации - их также нужно указывать, наряду со ссылкой на нас. Подробнее условия использования материалов смотрите здесь. |