Как именно Scala использует больше ядер, чем Java или другие нефункциональные языки? - PullRequest
0 голосов
/ 27 августа 2018

Недавно я слушал видео Мартина Одерского, где он пытается объяснить фундаментальное преимущество функциональных языков (таких как Scala, но, конечно, не обязательно Scala) над ООП или процедурными языками.

Перефразируя, он объясняет, что Закон Мура в последнее время подводит нас, и поэтому для ускорения процессоров вместо того, чтобы удваивать число транзисторов в ядрах, производители процессоров просто предлагают больше ядер. Это, в свою очередь, позволяет более эффективно использовать ЦП параллельными / многопоточными приложениями. Итак, первоочередная задача заключалась в следующем: чем более параллельным является приложение, тем больше фрагментов его кода выполняется одновременно на разных ядрах и с большим количеством ядер в ЦП, что в целом ускоряет выполнение программы.

Пока все хорошо.

То, что он не смог объяснить (или, скорее всего, то, что я не смог понять), это , почему функциональные языки, такие как Scala, пригодны для того, чтобы быть более параллельными, чем другие нефункциональные языки. Поскольку мы случайно говорим о пространстве JVM, давайте сделаем быстрое сравнение Java и Scala. Что это за программа Scala, которая, если бы вместо этого была реализована на чистой Java, затруднила бы параллелизацию / параллелизм, , особенно если она все компилируется до байт-кода JVM и работает на тех же JVM с одинаковыми родные возможности? ?

Это означает, что у меня есть два приложения JVM: App1, написанное на Java, и App2, написанное на Scala. Они оба выполняют одни и те же задачи и выполняют одни и те же вещи. Оба компилируются в байт-код JVM и запускаются на одном компьютере с той же JVM, установленной на нем. Как приложение Scala может «задействовать» возможности JVM, которые делают его более подходящим для параллелизма, чем Java (и, следовательно, быстрее на процессоре с большим количеством ядер)?

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

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

Можем ли мы разрабатывать приложения Scala быстрее, чем Java? Дело в том, что даже если приложения Scala медленнее на 10 ~ 15% (например) в плане скорости выполнения, но время разработки на ~ 30% быстрее с использованием лучших практик FP, тогда стоит использовать Scala (или другие функциональные языки). ). FP подчеркивает много функций компоновки и безопасности типов. Другой особенностью FP является использование значений (неизменяемых переменных) над переменными. Неизменность делает многоядерное программирование более простым в управлении и менее подверженным ошибкам. Java может сделать то же самое, используя лучшие практики FP. Таким образом, во время разработки Java-программисты столкнутся с множеством неудобств, потому что эти методы не всегда доступны в Java.

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

Аргумент, когда приложения Java и Scala компилируются в байт-код JVM и выполняется под одной и той же JVM, поэтому они должны иметь одинаковые возможности, неверен. Оба приложения ограничены возможностями JVM, если только одно из них не использует недокументированные функции JVM. Тогда этот язык имеет «несправедливое» преимущество. Не говоря о том, что единственный язык быстрее, чем другой, учитывая ту же среду выполнения JVM, заключается в более эффективной организации байт-кода.

0 голосов
/ 27 августа 2018

Вы абсолютно правы, когда говорите, что оба ваших приложения в конечном итоге сводятся к байт-коду на JVM. Большинство библиотек и сред, доступных Scala для параллелизма, также доступны для Java. Однако, что выделяет Scala - это Встроенная в Scala поддержка неизменяемости . Scala имеет очень богатые неизменяемые коллекции, и эта особенность использования неизменяемости облегчает написание кода для параллельных и параллельных приложений. Scala абстрагирует пользователя от написания кода уровня потока и позволяет пользователю больше сосредоточиться на бизнес-логике. Futures API очень удобен в этом.

Scala включает в себя парадигму функционального программирования (то есть составление функций) и изоляцию изменяемого состояния внутри акторов, с помощью которого вы можете устранить все типичные проблемы параллелизма, с которыми вы столкнетесь, например, программирование потоков на Java. Вот почему Scala был выбран в качестве языка для разработки Spark.

Теперь перейдем к основной части вашего вопроса о том, как scala использует больше ядер по сравнению с другими не функциональными языками: Futures API в scala имеет базовый контекст выполнения, который представляет собой не что иное, как пул потоков, который настраивается разработчиком. Используя этот API, вы сможете использовать все свои ядра.

...