Скорость различных конструкций в языках программирования (Java / C # / C ++ / Python /…) - PullRequest
7 голосов
/ 28 декабря 2010

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

Теперь мне интересно, есть ли сайт с информацией о быстрых различных конструкций на разных языках, особенноJava / C # / Python /… (также C ++, но есть так много компиляторов, которые, вероятно, сильно отличаются).

Например, есть ли разница между

if (a()) b();

и

a() && b();

Другой пример: может ли a = a * 4 быть скомпилирован с тем же кодом, что и a <<= 2?

Я мог бы проверить это сам, конечно, написав оба, затем выполнив их 100000 раз и сравнив время выполнения, ноЯ также хотел бы узнать о новых способах писать вещи, возможно, даже вещи, которые я раньше не рассматривал.Спасибо за ваши ответы!

Ответы [ 4 ]

11 голосов
/ 28 декабря 2010

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

Выбор алгоритма имеет значение, но книги, которые вы должны читать, должны быть больше похожи на это или это .

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

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

9 голосов
/ 28 декабря 2010

есть ли разница между if (a()) b(); и a() && b();?

Да, удобочитаемость.Первый гораздо яснее о намерении.

Может ли a = a * 4 быть скомпилирован с тем же кодом, что и a <<= 2?

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

Микро-оптимизация для современных процессоров

  • в основном бесполезна
  • очень сложно
  • часто вопреки тому, что раньше было «оптимизацией» 5или 10 лет назад.

В заключение напишите сначала читаемый код.Если у вас есть проблемы с производительностью, сначала профилируйте и измерьте.

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

8 голосов
/ 28 декабря 2010

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

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

4 голосов
/ 28 декабря 2010

Всегда старайтесь создавать хороший, чистый и эффективный код.Это может означать микрооптимизацию (например, использовать stringbuilder вместо добавления строк, не использовать регулярные выражения, если они не нужны, и тому подобное, не слушать людей, которые говорят, что это бессмысленно: если вы пишете плохой код и недаже не волнуйтесь, JITter вам не поможет) или узкие места (не выбирайте * из всей таблицы, используйте многопоточность).Управляемая среда сделает все остальное.Интенсивная загрузка ЦП никогда не будет столь же производительной, как неуправляемый код, но также есть много преимуществ, поэтому большинству людей нравится их использовать.Если вам нужны действительно быстрые фрагменты кода, делайте это на C, сборке или оборудовании.Большинство современных бизнес-приложений не нагружают процессор, так как в графических интерфейсах, веб-сервисах, базах данных, использовании диска они все требуют много времени ожидания и простоя процессора.

Что касается вашего вопроса: if (a ())б ();и a () && b ();полностью одинаковы, здесь нет никакой оптимизации.a * a и << 2 не являются одинаковыми, последний является * 4. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...