2016-04-20 4 views
3

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

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

Вызывает метод, столь дорогостоящий на Android, что я должен избегать его за счет удобства чтения в местах, где метод может вызываться много раз? Кроме того, создает одноразовые методы, подобные этому, нахмурившись из-за ограничения метода DEX? (это приложение уже использует multidex).

Этот вопрос не является дубликатом других подобных java-вопросов, потому что я спрашиваю конкретно о производительности на Android, у которой есть свои особенности.

+0

Возможный дубликат [java, как дорого - вызов метода) (http://stackoverflow.com/questions/6495030/java-how-expensive-is-a-method-call) – Gauthier

+2

_Is вызывает метод, столь дорогой на Android, что я должен избегать этого за счет удобочитаемости в тех местах, где метод может быть вызван много раз? _ У меня нет номеров, но определенно нет. VM будет выполнять оптимизацию по мере ее запуска, а также компилятор. Напишите поддерживаемый, легко читаемый код. –

+0

Если есть проблема с производительностью, вы должны получить данные перед оптимизацией, если вы не получаете данные (например, бенчмаркинг), тогда вы не оптимизируете, а принимаете догадки о том, что улучшит производительность. – cyroxis

ответ

7

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

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

+0

Согласен. Читаемость кода и ремонтопригодность важнее imo. Кодекс, который трудно поддерживать, станет производительным свистом сам по себе просто потому, что код не может быть легко понят для улучшения его производительности. – tatmanblue

2

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

Любые советы такого характера во время проверки кода, вероятно, необоснованна.

  1. Стоимость вызова метода имеет значение только в том случае, если метод вызывается часто.

  2. Стоимость вызова метода зависит от того, насколько хороши компилятор/оптимизатор. Они со временем будут меняться по мере развития компиляторов Android. На самом деле, скорее всего, вызовы метода становятся менее дорогими ... пока они не достигнут точки, когда компиляторы так же хороши, как (или лучше) среднего программиста при оптимизации прямого кода.

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

Вызывает метод, столь дорогостоящий на Android, что я должен избегать его за счет удобства чтения в местах, где метод может вызываться много раз?

Erm ... no. Большинство вызовов методов не способствуют узким местам производительности.И действительно, многие узкие места в производительности не способствовали восприятию производительности. Для типичного интерактивного приложения, это только медлительность/отсталость, которая влияет на пользовательский опыт, который действительно имеет значение.

Любые советы, позволяющие избежать вызова методов, подходят только для одного и того же номера.

Код, тест, измерение, профиль ... и ТОГДА оптимизируйте.

Смежные вопросы