Производительность Scala для Android

Я только начал изучать Scala, и у меня есть время в моей жизни. Сегодня я также только что слышал о Scala для Android, и я полностью подключен.

Однако, учитывая, что Scala похож на супермножество Java в том, что он является Java++ (я имею в виду Java с большим количеством включенных данных), мне интересно, как будет работать код Scala в Android?

Также будет затронута производительность приложения для Android, если он написан с помощью Scala? То есть, если есть какая-либо дополнительная работа, необходимая для интерпретации кода Scala.

Ответы

Ответ 1

Объяснить немного @Aneesh answer - Да, нет дополнительной работы для интерпретации байт-кода Scala, потому что он точно такие же биты и куски, что и байт-код Java.

Enter image description here

Обратите внимание, что также есть байт-код Java bytecode = > Dalvik при запуске кода на Android.

Но используя те же кирпичи, вы можете построить велосипед, а другой парень может построить городской городок. Например, из-за того, что язык поощряет неизменность Scala генерирует много коротких живых объектов. Для зрелых JVM, таких как HotSpot, это не имеет большого значения в течение примерно десятилетия. Но для Dalvik это проблема (до пула объектов недавних версий и жесткое повторное использование уже созданных объектов было одним из самых распространенных советы по производительности даже для Java).

Далее, запись val не совпадает с записью final Foo bar = .... Внутренне этот код представлен как поле + getter (если вы не префикс val с private [this], который будет переведен в обычное конечное поле). var преобразуется в поле + getter + setter. Почему это важно?

В старых версиях Android (до 2.2) вообще не было JIT, поэтому this оказывается около 3x-7x штрафа по сравнению с прямым доступом к полю. И, наконец, в то время как Google инструктирует вас избегать внутренних классов и предпочитает пакеты вместо, Scala создаст много внутренних классов, даже если вы Так пишите. Рассмотрим этот код:

object Foo extends App {
    List(1,2,3,4)
      .map(x => x * 2)
      .filter(x => x % 3 == 0)
      .foreach(print)
}

Сколько внутренних классов будет создано? Вы можете сказать, что нет, но если вы запустите scalac, вы увидите:

Foo$$anonfun$1.class       // Map
Foo$$anonfun$2.class       // Filter
Foo$$anonfun$3.class       // Foreach
Foo$.class                 // Companion object class, because you've used `object`
Foo$delayedInit$body.class // Delayed init functionality that is used by App trait
Foo.class                  // Actual class

Таким образом, будет наказание, особенно если вы напишете идиоматический код Scala с большим количеством неизменяемости и синтаксиса сахара. Дело в том, что это сильно зависит от вашего развертывания (вы нацеливаете новые устройства?) И фактических шаблонов кода (вы всегда можете вернуться к Java или хотя бы записать меньше идиоматического кода в критических точках производительности), и некоторые из упомянутых там проблем будут (последний) в следующих версиях.

Исходное изображение источник был Wikipedia.

См. также вопрос о переполнении стека Использует ли Scala на Android стоит? Много накладных расходов? Проблемы? для возможных проблем, с которыми вы можете столкнуться во время разработки.

Ответ 2

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

http://cse.aalto.fi/en/midcom-serveattachmentguid-1e3619151995344619111e3935b577b50548b758b75/denti_ngmast.pdf

Я не читал всю статью, но, в конце концов, кажется, что они дадут точку в Java:

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

Кредиты Маттиа Денти и Юкки К. Нурминен из Университета Аалто.

Ответ 3

Пока Scala "будет работать", потому что он скомпилирован в байтовый код, как Java, есть проблемы с производительностью. Идиоматический код Scala имеет тенденцию создавать намного более временные объекты, а Dalvik VM не слишком любезно относится к ним.

Вот некоторые вещи, о которых вы должны быть осторожны при использовании Scala на Android:

  • Векторы, поскольку они могут быть расточительными (всегда занимают массивы из 32 элементов, даже если вы держите только один элемент).
  • Цепочка методов для коллекций - вы должны использовать .view везде, где это возможно, чтобы избежать создания избыточных коллекций.
  • Бокс - Scala будет вставлять ваши примитивы в разных случаях, например, с помощью Generics, используя Option [Int] и в некоторых анонимных функциях.
  • для циклов может потерять память, подумайте о замене их на циклы while в чувствительных разделах
  • Неявные преобразования - вызовы типа str.indexWhere(...) будут выделять объект-оболочку в строке. Может быть расточительным.
  • Scala Карта будет выделять опцию [V] каждый раз, когда вы получаете доступ к ключу. Мне пришлось иногда заменять его Java HashMap.

Конечно, вы должны оптимизировать места, которые являются узкими местами после использования профилировщика.

Вы можете больше узнать о предложениях, приведенных выше в этом сообщении в блоге: http://blogs.microsoft.co.il/dorony/2014/10/07/scala-performance-tips-on-android/

Ответ 4

Scala компилятор создаст байт-код JVM. Таким образом, в основном на более низком уровне это просто работает с Java. Таким образом, производительность будет эквивалентна Java.

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