Есть ли какие-нибудь ресурсы для независимых от языка советов по производительности? - PullRequest
0 голосов
/ 26 марта 2010

Я работаю со многими людьми, которые программируют видеоигры для жизни. Я немного разбираюсь в C ++ и знаю несколько общих стратегий производительности, которые можно использовать в повседневном программировании. Как и при использовании префикса ++ / - поверх постфикса.

Моя проблема в том, что часто люди приходят ко мне, чтобы дать им советы по общей оптимизации, которую они могут делать на регулярной основе при программировании, но часто эти люди программируют на самых разных языках. Некоторые используют C ++, C #, Java, ActionScript и т. Д.

Мне интересно, есть ли какие-нибудь общие советы по производительности, которые можно использовать на ежедневной основе программирования? Например, я бы предложил префикс ++ / - over postfix для людей, программирующих на другом языке, но я просто не уверен, что это правда.

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

Ответы [ 4 ]

1 голос
/ 26 марта 2010

Не вдаваясь в языковые особенности или даже не зная, является ли это встраиваемым, сетевым, CAD, игровым или iPhone программированием, мало что можно сказать. Все, что мы знаем, это то, что задействовано несколько языков, и по неизвестной причине производительность всегда ниже, чем хотелось бы.

Сначала проверьте свои алгоритмы. Медленный алгоритм может привести к ужасной производительности. Читайте об алгоритмах и их сложности.

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

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

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

0 голосов
/ 07 января 2012

Несколько вещей, которые я узнал с тех пор, как спросил это:

  1. Операции ввода-вывода, как правило, являются самыми дорогими по производительности. Это особенно верно, когда вы выполняете дисковый или сетевой ввод-вывод (который обычно является самым дорогим, потому что если вам приходится ждать ответа от другого хоста, вам придется ждать всех операций обработки и ввода-вывода, которые делает удаленный хост ). Выполняйте эти операции только тогда, когда это абсолютно необходимо, и, возможно, рассмотрите возможность использования кэша, когда это возможно.

  2. Операции с базой данных могут быть очень дорогими из-за сетевого / дискового ввода-вывода и времени перевода в и из SQL. Использование БД или кэша в памяти может помочь уменьшить проблемы ввода-вывода, а некоторые (не все) базы данных NoSQL могут сократить время перевода SQL.

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

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

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

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

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

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

  9. Если речь идет о производительности, не используйте интерпретируемые языки (языки сценариев).

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

  11. Любые метрики синхронизации, о которых вы сообщаете, делают как можно более детализированными. В настоящее время вам может потребоваться беспокоиться только о количестве миллисекунд, которые занимает процесс, но в будущем, когда вы сделаете свое приложение все быстрее и быстрее, вам может потребоваться более детальная синхронизация. Если версия A использует миллисекунды, а версия B использует микросекунды, как можно сравнить производительность, если версия B занимает примерно такое же количество миллисекунд? Версия B может быть лучше, но вы просто не можете сказать, потому что версия A не использовала достаточно детальные метрики.

0 голосов
/ 26 марта 2010

Я думаю, вам нужно разделить это на два отдельных вопроса:

1) Существуют ли не зависящие от языка способы найти проблемы с производительностью? ДА. Профиль, но избегайте мифов вокруг этой темы .

2) Существуют ли не зависящие от языка способы исправить проблемы с производительностью? ЭТО ЗАВИСИТ.

Общий принцип, не зависящий от языка: делай (1), прежде чем делать (2).
Другими словами, готов-цель-огонь, а не готов-огонь-цель.

Вот пример настройки производительности на C, но это может быть любой язык.

0 голосов
/ 26 марта 2010

Не думаю, что вы можете обобщить оптимизацию как таковую. Чтобы оптимизировать время выполнения, вам нужно углубиться в язык и понять, как все работает подробно . Просто угадывать или делать предположения об опыте работы с другими языками не получится! Например, написание x = x << 1 вместо x = x*2 может быть большим преимуществом в C ++. В JavaScript это замедлит вас.

При всех различиях между всеми языками трудно найти общие советы по оптимизации. Может быть, для некоторых языков, которые похожи (например, C # и Java). Но если вы добавите в этот список и JavaScript, и Python, я уверен, что не все общие методы оптимизации останутся.

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

Однако, есть одна вещь, которая приходит на ум. За последние десять лет объектно-реляционные картографы стали довольно популярными. И, следовательно, они появляются (d) практически на всех популярных языках. Но вы должны быть осторожны с этим. Легко загрузить тонны данных в память, которые вы никогда не будете использовать в своем коде, если не настроены должным образом. Запомни. Ленивая загрузка может быть полезна здесь. Но ваш пробег будет варьироваться.

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

...