Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш канал: @proJVM Вакансии: @jvmjobs @jvmjobschat ⚠️ Оффтоп -> @flood ❌Переход на личности ❌Троллинг ❌Реклама ❌HH (вакансии) ❌Варез
Я ниже чем Java 6 (1.6) никогда не опускался, но даже тогда использовался StringBuilder. Но да, сейчас посмотрел, всё же в некоторых местах байт-код меняется
Читать полностью…Теоретически там вообще может быть свой Arrays с другим asList в рантайме, но это дичь, безусловно.
Читать полностью…Я думаю, что конкретно здесь не очень тривиально доказать, что список всегда будет с одним и тем же содержимым, несмотря на то, что для человека это очевидно. Но джавац вроде как действительно фолдит только low hanging fruit, остальное отдается на откуп джиту, который местами может сделать те же вещи, но на основе не только статической информации, но и профиля (тупой пример: константа, которая резолвится в рантайме, может быть заинлайнена в метод, это конечно не фолдинг, но я просто привожу пример, почему это в некотором роде двойная работа)
Читать полностью…https://shipilev.net/jvm/anatomy-quarks/18-scalar-replacement/
Читать полностью…Компилятор может перенести аллокацию полей List на стек, но все равно остается вложенный массив. Лучше писать стандартный код, с иммутабельными объектами в static final полях
Читать полностью…Кажется, что это вполне себе compile-time оптимизация, нет?
Читать полностью…А javac не умеет в constant folding для непримитивов? Например, в таком куске я бы не хотел чтоб каждый раз пересоздавался лист:public boolean isDone() {
)
return Arrays.asList(Status.COMPLETED, Status.FAILED
;
.contains(this.status)}
да пойдет, но надо опять приседания делать.А посмотрели недавно на spring cloud, и кажется, что их можно вообще не делать
Читать полностью…у нас уже есть своя реализация сервиса для публичного API, где происходит аутентификация/авторизация, прикручен гибкий рейт-лимитинг и трассировка.
Из плюсов, что свое решение всегда можно самостоятельно расширить/дополнить.
Из минусов
- приходится писать кучу бойлерплейта, суть которого в проксировании запроса во внутренний сервис и трансляции респонса от него
- сервис комунальный, пишут в него разные команды, со временем могут напихать туда лишней логики и превратить его в помойку
- сервис блокирующий, замедление обработки в одном из внутренних сервисов может привести к исчерпанию пула потоков для обработки новых запросов
Эти минусы spring cloud закрывает хорошо.
В рейт-лимит он вроде тоже умеет, в трассировку вроде тоже
ну то есть максимум подкачать из бд какие-то роли и чисто эндпоинты ограничивать и всё, а остальное что-то более сложное уже прописывать в контроллерах и там уже через бд напрямую проверять что-то, так?
Читать полностью…которое и достук к апи выдает различным клиентам/рэйтлимиты/статистика/биллинг и тд и тп
Читать полностью…Нет, и стрингбилдер наверное не сразу появился (тогда ещё джава в моей жизни не появилась, Так что я не знаю), с девятки у нас StringConcatFactory с помощью invokedynamic. Собственно --release плюс-минус для/из-за этого и существует
Читать полностью…Здесь не догнал. По идее разный javac и должен выдавать разный байткод, так у нас конкатенация строк получает разные имплементации
Читать полностью…Просто потому что нет такой оптимизации? Можете же сами скомпилировать и проверить. Потенциально подобные оптимизации могут сломать трансформеры байт-кода, когда у вас меняется байт-код (за исключением его версии) в зависимости от версии javac - не круто.
UPD: Компилятор сам по себе не может наверняка знать насколько критичная оптимизация, а что если вызов Arrays#asList будет очень важен для вас? В одном кейсе нет, в другом да, потому компилятор и не будет переписывать за вас код.
https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/lang/StringLatin1.java#L304
Поч здесь сразу без раздумий не дропнули arraycopy()?
Если ссылка на созданный объект не покидает локальный скоуп, то может
Читать полностью…Почему? Во многих языках это оптимизация именно компилятора
Читать полностью…Нет, в compile-time таких оптимизаций нет. Компилятор может удалить мёртвый код, может сгенерировать байт-код, который не совсем соответствует коду (но логически всё останется так-же), но откровенно "плохой код" он за вас не перепишет
Читать полностью…javac нет, но JIT вполне может оптимизировать тут, если посчитает нужным
Читать полностью…Я реализовал через абстрактный конвеер с дженериком
и аннотацию - а реализацию как раз доверил JavaModule.
Спасибо.
В итоге сократил код до одной строчки над классом.
Привет, простите заранее за тупой вопрос.
Вопрос связан с градлом и подключением как я понял плагинов из ноды.
В проекте добавляются плагины через плагин менеджер, из node_modules (и да оно существует, я заранее проверил)
pluginManagement {
def reactNativeGradlePlugin = new File(
providers.exec {
workingDir(rootDir)
commandLine("node", "--print", "require.resolve('@react-native/gradle-plugin/package.json', { paths: [require.resolve('react-native/package.json')] })")
}.standardOutput.asText.get().trim()
).getParentFile().absolutePath
includeBuild(reactNativeGradlePlugin)
def expoPluginsPath = new File(
providers.exec {
workingDir(rootDir)
commandLine("node", "--print", "require.resolve('expo-modules-autolinking/package.json', { paths: [require.resolve('expo/package.json')] })")
}.standardOutput.asText.get().trim(),
"../android/expo-gradle-plugin"
).absolutePath
includeBuild(expoPluginsPath)
}
plugins {
id("com.facebook.react.settings")
id("expo-autolinking-settings")
}
extensions.configure(com.facebook.react.ReactSettingsExtension) { ex -> ex.autolinkLibrariesFromCommand()
// if (System.getenv('EXPO_USE_COMMUNITY_AUTOLINKING') == '1') {
// ex.autolinkLibrariesFromCommand()
// } else {
// ex.autolinkLibrariesFromCommand(expoAutolinking.rnConfigCommand)
// }
}
спринг клауд решение очень примитивное, если сравнивать с коробкой
Читать полностью…