Обоснование использования непереносимого кода

Как выбрать, оправдывает ли кто-то свои дизайнерские компромиссы с точки зрения оптимизированного кода, ясности реализации, эффективности и переносимости?

Соответствующим примером для цели этого вопроса может быть обработка больших файлов, где «большой файл» - это «довольно много ГБ» для проблемы, которая может быть упрощена с использованием методов произвольного доступа.

Подходы для чтения и изменения этого файла могут быть следующими:

  1. В любом случае используйте потоки и ищите желаемое место - это переносимо, но потенциально медленное и непонятное - это будет работать практически для всех ОС.
  2. сопоставьте соответствующую часть файла как большой блок. Например, mmap фрагмент файла размером 50 МБ для обработки для каждого фрагмента - это будет работать для многих ОС, в зависимости от тонкостей реализации mmap для этой системы.
  3. Просто выполните mmap для всего файла - для этого требуется 64-разрядная ОС, и это наиболее эффективный и понятный способ реализовать это, однако он не работает в 32-разрядных ОС.

person Arafangion    schedule 23.06.2009    source источник
comment
mmap довольно портативен. Он доступен в той или иной форме во всех основных ОС, включая встроенные ОС, при условии, что доступна виртуальная память. В системах, где виртуальная память недоступна, вызов mmap может быть доступен, но, как правило, он невысок с точки зрения производительности и не имеет такого же поведения по отношению к грязным страницам.   -  person SingleNegationElimination    schedule 24.06.2009
comment
Токен: виртуальная память для файла размером в несколько ГБ определенно недоступна в 32-разрядной системе.   -  person Arafangion    schedule 24.06.2009
comment
Вам не нужно перенаправлять весь файл сразу. Как сказано в OP, вы можете отображать кусок за раз.   -  person nobody    schedule 24.06.2009


Ответы (5)


Не уверен, о чем вы спрашиваете, но частью процесса проектирования является анализ требований к переносимости и производительности (среди других факторов).

Если вы знаете, что вам никогда не понадобится переносить код и вам нужна абсолютно лучшая производительность, то вы соответствующим образом скорректируете свою реализацию. Нет смысла быть портативным только ради самого себя.

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

person Justicle    schedule 23.06.2009
comment
Нет смысла быть переносимым только ради самого себя - интересная концепция, но разве не считается лучшей практикой разрабатывать свое приложение таким образом, чтобы оно было переносимым, даже если вы откладываете фактическое тестирование на альтернативных ОС до того момента, когда оно вам действительно нужно? - person Arafangion; 24.06.2009
comment
За переносимость приходится платить, а ресурсы разработчиков ограничены. Гибкая разработка говорит: «Не делайте больше, чем вам нужно»; конечно, мы поступаем мудро, не воспринимая это слишком буквально. Но нахождение баланса по-прежнему зависит от проекта и ресурсов. Например, я мог бы разработать приложение только для Win32, зная, что оно может работать с WINE, или предполагая, что его можно запускать в OS / X под VMware. В этом смысле я перекладываю переносимость на кого-то другого. - person lavinio; 24.06.2009
comment
@Arafangion - Нет, не рекомендуется делать что-либо, если оно вам не нужно. - person Justicle; 24.06.2009
comment
@Justicle: Лучше всего сделать программу переносимой, чтобы ее могло использовать как можно больше людей. Если вы разрабатываете свой код так, чтобы он никогда не был переносимым, удачи, когда дело доходит до обновления вашей программы до следующей версии любой ОС. ;) - person Partial; 24.06.2009
comment
@Partial - Конечно! Также лучше, чтобы ваша программа работала как можно быстрее, использовала как можно меньше ресурсов, имела как можно меньше ошибок и разрабатывалась в кратчайшие сроки. Вы поняли мою точку зрения? :-) - person Justicle; 24.06.2009
comment
@Justicle: Я понимаю вашу точку зрения. С другой стороны, создание переносимой программы не означает, что она будет медленной и потребует много ресурсов. На разработку может уйти немного больше времени, и ее сложнее запрограммировать. В конце концов, вы получите больше, если сделаете его портативным. Дополнительное время, которое вы потратите на то, чтобы сделать его портативным, сэкономит время и деньги в будущем. Иногда лучше увидеть жизнь программы в долгосрочной перспективе. Возвращаясь к вашей точке зрения, это правда, что не все программы должны быть переносимыми, но когда вы можете, попробуйте сделать это. - person Partial; 24.06.2009
comment
В гибкой разработке говорится, что не делайте больше, чем вам нужно. Однако во многих отношениях разумно планировать будущее. Это требует предсказания будущего, что, конечно, не является надежным, но стоит сделать обоснованное предположение и, возможно, применить подход к анализу непредвиденных обстоятельств (управлению рисками). - person Craig McQueen; 10.07.2009

Без ограничений на этот вопрос рационально нельзя ответить рационально.

Вы спрашиваете «какой цвет лучший», не сообщая нам, рисуете ли вы дом, машину или картину.

Ограничения будут включать как минимум

  • Выбранный язык
  • Целевые платформы (многопроцессорный сервер промышленного уровня или iPhone?)
  • Оптимизация по скорости по сравнению с памятью
  • Стоимость (кто финансирует это и есть ли ограничения на доставку?)

Никакая программа не может обладать «максимальной» переносимостью.

Примером такого рода проблемы, решаемой с использованием различных методов, но с жесткими ограничениями как на конкретный требуемый ввод / вывод, так и на оценку «наилучшего», может быть Проект WideFinder.

person lavinio    schedule 23.06.2009
comment
Меня больше беспокоят «лучшие практики» - например, считается, что лучше всего использовать переносимые библиотеки POSIX даже при написании только для Linux, а не использовать специфичные для ОС функции, если они эквивалентны. - person Arafangion; 24.06.2009

По сути, вам нужно сначала подумать, прежде чем писать код. Каждый проект уникален, и анализ потребностей может помочь решить, что для него является первичным. Что станет лучшим решением для любого проекта, зависит от нескольких вещей ...

Во-первых, будет ли этот проект мультиплатформенным или, в конечном итоге, он станет мультиплатформенным? В зависимости от вашего выбора выбрать правильный язык программирования должно быть проще. Опять же, вы также можете использовать более одного языка в своем проекте, и это совершенно нормально. Портативность не обязательно означает меньшую производительность. Все это означает, что для достижения ваших целей потребуется более тяжелая работа, потому что вам понадобится качественный код. Кроме того, у каждого языка программирования своя философия. Узнай, какие они есть. Одно можно сказать наверняка, определенные проблемы часто возвращаются снова и снова. Вот почему знание различных шаблонов дизайна иногда может иметь значение, но некоторые языки имеют свои собственные идиомы и могут быть очень важны при выборе языка. Еще одна вещь, о которой нужно подумать, - это различные подходы, которые вы можете использовать для своего проекта. Вы можете использовать многопоточность, сокеты, клиент-серверные системы и многие другие технологии. Выбор правильной технологии может помочь сделать проект лучше.

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

person Partial    schedule 24.06.2009

Это действительно зависит от драйверов для проекта. Если вы занимаетесь корпоративной разработкой внутри компании, то сделайте самое простое, что может сработать на вашем целевом уровне сложности. Мод для производительности требует по мере необходимости.

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

person Scott Weinstein    schedule 23.06.2009
comment
Как бы вы выбирали между кодированием для одной ОС, т. Е. Сделать вашу программу в значительной степени зависимой от win32, или разработать свое приложение так, чтобы только минимальный объем вашего кода зависел от win32, на всякий случай, если вы захотите использовать его в Mac OS X или Linux? Я бы, по крайней мере, попытался использовать архитектуру MVC (или аналогичную), даже если я никогда не собираюсь изменять какие-либо компоненты. - person Arafangion; 24.06.2009
comment
@Arafangion: вы можете разработать свой код таким образом, чтобы его можно было переносить в будущем, без реализации этой переносимости вначале. ООП может очень помочь и с использованием интерфейсов. Идиома Pimpl - отличный способ добиться этого. - person Partial; 24.06.2009

Переносимость ради переносимости была маркетинговой уловкой для Java с момента ее создания и является фактом жизни C по соглашению, и я считаю, что большинство людей, которые ее придерживаются, «выросли» на Java или C, так скажут.

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

person Jon Limjap    schedule 10.07.2009