ImageIO

Версия Minecraft
0.1+
1,111
47
420
Крч есть у меня такой вот код:
Scala:
override def bindTexture(resource: Resource): Unit = {
    if (!resource.isTexture) throw new RuntimeException(s"$resource is not a texture")
    textures.get(resource) match {
      case Some(texture) =>
        texture.bindAsTexture()
      case None =>
        getInput(resource) match {
          case Some(input) =>
            val image = ImageIO.read(input)
            val unit = image.toGLTexture
            textures.put(resource, unit)
            unit.bindAsTexture()
          case None =>
            bindTexture(emo)
        }

    }
  }
Да, да тригеритесь на скалу. Суть в том что он должен был бы загрузить картинку из потока, но он тупа даже не входит в метод read (ImageIO.read(input)). Вопрос собсвенна пачему?
 
7,099
324
1,510
new в java ведь не очень дорогой, почему вы так беспокоитесь за создание экземпляра функции?
 

CumingSoon

Местный стендапер
1,634
12
269
new в java ведь не очень дорогой, почему вы так беспокоитесь за создание экземпляра функции?
  1. Мусор - всегда плохо. Если он копится, то рано или поздно его чистить
  2. Отсюда вытекает, что лучше операции, нежели операции внутри класса. Это излишне
  3. Вдобавок создаётся отдельный класс, насколько я помню. Синтетический, вроде. А классы разве можно чистить GC? Не помню такого
  4. Да и объектов этого класса может создаваться несколько, например, в цикле.
  5. Лишние операции на вызов метода в классе (например, лишний invoke***)
  6. И зачем?
 
7,099
324
1,510
  • Мусор - всегда плохо. Если он копится, то рано или поздно его чистить
  • Отсюда вытекает, что лучше операции, нежели операции внутри класса. Это излишне
Хороший аргумент, но это проблемы платформы jvm
Вдобавок создаётся отдельный класс, насколько я помню. Синтетический, вроде.
1 раз создается для каждой лямбды - если в коде n лямбд, то +n классов. Если новый класс создается при каждом вызове - это проблемы jvm.
Лямбды нужны для функционального программирования(хотя, в коде JustAGod этим не пахнет, но это другой разговор)
P.S. Если начинается холивар, то надо идти в оффтоп
 

CumingSoon

Местный стендапер
1,634
12
269
Это парадигма такая. Сборщик мусора пока ещё не может обеспечить идеальную работу, поэтому за памятью нужно следить. Скажи спасибо, ибо тут нет ручного управления памятью (а плохо это или хорошо?)
Класс 1 раз. Да и объект один раз, я немного не то написал.
Лямбды - часть ФП. Для ФП, очевидно, нужны функции. И парадигма ФП достаточно специфична, например, дешевыми рекурсиями. Сам понимаешь, в Джаве/Скале/Котлине рекурсии никак не дешевые. (теряю связь между мыслями) Так что получаем урезанное ФП - функции, которые либо пакуются в класс, либо разворачиваются в целях оптимизации
 
Последнее редактирование:
7,099
324
1,510
Да, но функции высшего порядка - очень важная концепция. Так что сборщик мусора должен иметь какую-то оптимизацию очистки неиспользуемых лямбд.
а плохо это или хорошо?
Например, было бы неплохо, если бы была в байткоде инструкция ручной очистки памяти и компилятор ее вставлял, когда лямбда переставала быть нужна
 
Да, но функции высшего порядка - очень важная концепция. Так что сборщик мусора должен иметь какую-то оптимизацию очистки неиспользуемых лямбд.

Например, было бы неплохо, если бы была в байткоде инструкция ручной очистки памяти и компилятор ее вставлял, когда лямбда переставала быть нужна
ФВП, де-факто, и так имеются. Я понятия не имею, коим образом они должны выглядеть в памяти окромя как класс с методом. Конечно, можно сделать отдельную кучу, в которую кладётся "коробочка с инструкциями" - функция; в аргументы метода же передавать ссылку на эту ф-ию. Но т.к. это требует изменения в JVM, то это требует изменения в JVM.
Ручная очистка вряд ли будет введена, т.к. это противоречит концепции Java.
 
2,505
81
397
Хороший аргумент, но это проблемы платформы jvm
Здорово конечно, но проблемы, все-таки, наши.

Если новый класс создается при каждом вызове - это проблемы jvm.
Класс-то точно создается один раз. Даже в бинарниках его увидеть можно. Но вот с самим объектом дела не совсем так. Если внутри лямбды используется какой-нибудь ПэрэнтКласс.this или другая внешняя переменная, то будет создаваться новый объект. Никакой магии. Лямбда это просто объект и аргументы в нее нужно как-то передать. Если же никаких переменных в лямбду не пробрасывается, то используется статический объект. Поэтому у меня и подгорает от джавы. А вот котлин - другое дело.
 
7,099
324
1,510
7,099
324
1,510
То, что было скомпилированно на старых версиях просто будет жрать больше(по сравнению с новыми) памяти, работая на сборщике мусора
 
Сверху