Этого треда уже нет.
Это копия, сохраненная 13 ноября 2014 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
57 Кб, 600x378
Очередного жабоотсоса тред #397409 В конец треда | Веб
Minecraft 1.8 has so many performance problems that I just don't know where to start with.

Maybe the biggest and the ugliest problem is the memory allocation. Currently the game allocates (and throws away immediately) 50 MB/sec when standing still and up to 200 MB/sec when moving. That is just crazy.

What happens when the game allocates 200 MB memory every second and discards them immediately?

With a default memory limit of 1GB (1000 MB) and working memory of about 200 MB Java has to make a full garbage collection every 4 seconds otherwise it would run out of memory. When running with 60 fps, one frame takes about 16 ms. In order not to be noticeable, the garbage collection should run in 10-15 ms maximum. In this minimal time it has to decide which of the several hundred thausand newly generated objects are garbage and can be discarded and which are not. This is a huge amount of work and it needs a very powerful CPU in order to finish in 10 ms.

Why not give it more memory? Let's give Minecraft 4 GB of RAM to play with. This would need a PC with at least 8 GB RAM (as the real memory usage is almost double the memory visible in Java). If the VM decides to use all the memory, then it will increase the time between the garbage collections (20 sec instead of 4), but it will also increase the garbage collection time by 4, so every 20 seconds there will be one massive lag spike.

Why not use incremental garbage collection? The latest version of the launcher by default enables incremental garbage collection (-XX:+CMSIncrementalMode) which in theory should replace the one big GC with many shorter incremental GCs. However the problem is that the time at which the smaller GCs happen and their duration are mostly random. Also they are not much shorter (maybe 50%) than a full scale GC. That means that the FPS starts to fluctuate up and down and there are a lot of random lag spikes. The stable FPS with a lag spike from time to time is replaced with unstable FPS and microstutter (or not very micro depending on the CPU). This strategy can only work with a powerful enough CPU so that the random lag spikes become small enough not to be noticeable.

How did that work in previous releases? The previous Minecraft releases were much less memory hungry. The original Notch code (pre 1.3) was allocating about 10-20 MB/sec which was much more easy to control and optimize. The rendering itself needed only 1-2 MB/sec and was designed to minimize memory waste (reusing buffers, etc). The 200 MB/sec is pushing the limits and forcing the garbage collector to do a lot of work which takes time. If it was possible to control how and when the GC works then maybe it would be possible to distribute the GC pauses such that they are not noticeable or less disturbing. However there is no such control in the current Java VM.

Why is 1.8 allocating so much memory? This is the best part - over 90% of the memory allocation is not needed at all. Most of the memory is probably allocated to make the life of the developers easier.

There are huge amounts of objects which are allocated and discarded milliseconds later.

All internal methods which used parameters (x, y, z) are now converted to one parameter (BlockPos) which is immutable. So if you need to check another position around the current one you have to allocate a new BlockPos or invent some object cache which will probaby be slower. This alone is a huge memory waste.

The chunk loading is allocating a lot of memory just to pass vertex data around. The excuse is probably "mutithreading", however this is not necessary at all (see the last OptiFine for 1.7).

the list goes on and on ...

The general trend is that the developers do not care that much about memory allocation and use "best industry practices" without understanding the consequences. The standard reasoning being "immutables are good", "allocating new memory is faster than caching", "the garbage collector is so good these days" and so on.

Allocating new memory is really faster than caching (Java is even faster than C++ when it comes to dynamic memory), but getting rid of the allocated memory is not faster and it is not predictable at all. Minecraft is a "real-time" application and to get a stable framerate it needs either minimal runtime memory allocation (pre 1.3) or controllable garbage collecting, which is just not possible with the current Java VM.

What can be done to fix it? If there are 2 or 3 places which are wasting memory (bugs), then OptiFine can fix them individually. Otherwise a bigger refactoring of the Minecraft internals will be needed, which is a huge task and not possible for OptiFine.

tldr; When 1.8 is lagging and stuttering the garbage collector is working like crazy and is doing work which has nothing to do with the game itself (rendering, running the internal server, loading chunks, etc). Instead it is constantly cleaning the mess behind the code which thinks that memory allocation is "cheap".
#2 #397414
Так какое правильное решение? Запилить нормальный дизайн или выбрать нормальный язык?
#3 #397417
>>397414
Нормальный дизайн на джаве без value-типов очень муторно делать. В смысле, сложно будет это назвать нормальным дизайном, хотя тормозить будет меньше.
#4 #397419
>>397414
>>397409

>over 90% of the memory allocation is not needed at all. Most of the memory is probably allocated to make the life of the developers easier.


>code which thinks that memory allocation is "cheap"



Это не языка проблема, а самых буквальных говнокодеров, для которых память, процессор и прочее бесконечны. Жабу не люблю, в том числе за неадекватный оверхед, но за такую хуйну написанную макаками жабу бранить нелепо.
#5 #397422
Простыню не читал. Вангую быдлокодерков.
#6 #397423
КОКОКО ИНДАСТРИ СТАНДАРТ КУКАРЕКУ ПАМЯТЬ НИРИСУРС КОКОКО ДОКУПИТЕ ЕЩЁ ОДНУ ПЛАНКУ КУДАХ
#7 #397456
>>397419
Хуита. В жабе вообще на каждый пук новые объекты создаются, даже если надо лишь по сраному HashMap пройти.
#8 #397464

>Currently the game allocates (and throws away immediately) 50 MB/sec when standing still and up to 200 MB/sec when moving.


ясн
#9 #397474
>>397419

>Нет приличного GC


>Нет аналогов value-типов


>Это не языка проблема, а самых буквальных говнокодеров


kek, и их проблема в том что они выбрали фреймворк для преобразования XML вместо языка
#10 #397476
>>397464
Чего тебе, планку памяти не докупить? Вот лошара. Время разработчика дороже, чем планка памяти.
#11 #397477
>>397476
Памяти одной для жабы уже мало, нужно покупать еще и топовые процы.
#12 #397478
>>397477
Дак крестоблядям покупать их не надо - но у них и денег нету. Вот и бомбят
#13 #397481
>>397477

>топовые процы


Что за нищебродство! Покупаешь сервант от НР, накатываешь azul, и запускаешь хоть сотню майнкрафтов. Солидно, интерпрайзно.
#14 #397482
>>397409
Читать статью пробовал, мудило?
sage #16 #397504
>>397492
Ложь, пиздеж и провокация. Сами с пацанами в офисе делали практически такой же тест на прошлой неделе, так вот, жава соснула у всех, кроме сишарпа. У нас получилось так: няшная > ада > го > жабка > сисярп, что было вполне ожидаемо. Кстати у них там по ссылке какие-то времена выполнения странные, 50+ сек, для 50 числа -- слишком много же
1625 Кб, 384x216
#17 #397507
>>397492

ОТСОС ТАК ОТСОС

$ ./run.sh 50
Running java test
LANGUAGE JAVA: 12586269025

real\t2m12.236s
user\t2m11.350s
sys\t0m0.468s

Running C++ test
LANGUAGE CPP:12586269025

real\t1m46.430s
user\t1m45.967s
sys\t0m0.432s

Для уебищ, которые проскроллили до этого момента, поясняю где начинается РЕАЛЬНЫЙ ОТСОС:

Жаба: 21896Kb ~ 22M
Плюсы: 824Kb ~ 0.9M
Си: 360Kb ~ 0.4M
#18 #397508
>>397482
The general trend is that the developers do not care that much about memory allocation and use "best industry practices" without understanding the consequences. The standard reasoning being "immutables are good", "allocating new memory is faster than caching", "the garbage collector is so good these days" and so on.
#19 #397513
Внезапно, няшная лизнула у Ады (всего полсекунды). А про жаву и так всё понятно.

time ../C/fib2 50; time ../Ada/fib2 50; time ../Go/fib2 50; time java fib 50
Fibonacci(50) = 12586269025

real 1m1.586s
user 1m1.580s
sys 0m0.001s
Fibonacci( 50 ) = 12586269025

real 1m1.003s
user 1m0.992s
sys 0m0.003s
Fibonacci( 50 ) = 12586269025

real 1m26.309s
user 1m26.361s
sys 0m0.009s
LANGUAGE JAVA: 12586269025

real 1m50.770s
user 1m50.773s
sys 0m0.013s
#20 #397514
>>397492
На микробенчмарках нет смысла мерять. Там нет задач, где может быть 200Мб аллокаций в секунду.
#21 #397543
Нам нужен майнкрафт на питоне.
#22 #397551
>>397543
На джаваскрипте, очевидно же.
sage #24 #397581

> Аллоцируется 200МБ/с и сразу же дискардится


> Не проблема разработчиков



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

...сравнивают языки с ручным управлением памятю и GC языки...

сукпздц
#25 #397590
>>397507
Что там за код написан такой? Оно за доли секунды везде считаться должно.
http://ideone.com/5zYH2c
#26 #397617
>>397590
Самый неоптимальный пиздец какой только можно придумать там
[code]long fib( long n)
{
return n<2?n:fib(n-1)+fib(n-2);
}[/code]
#27 #398020
>>397507
Попробуй написать что-то более менее сложное на С++. Эти люди просто ценили свое время и не особо парились по поводу производительности .
#28 #398129
>>398020

>Эти люди просто ценили свое время


Ценители своего времени не станут 90% времени бодаться с примитивностью и костыльностью явы вместо решения поставленной задачи.
#29 #398274
>>398129

>Ценители своего времени не станут 90% времени бодаться с примитивностью и костыльностью C++ вместо решения поставленной задачи.

#30 #398298
>>397409
ну так в чем проблема то? не нравится тормоза, связанные с памятью - использую плюсы и получи решето
#31 #398350
НУ А КАК НА ЯВЕ ПРОГРАМИРОВАТЬ?
МАССИВОВ ИЗ СТРУКТУР ДАННЫХ НЕТ
ТОКА МАССИВЫ ССЫЛОК НА КАКШКИ
#32 #398351
И КАКОВА ХУЯ МОЙ ТРИПКОД ЗАБАНИЛИ?
ПИЗДЕЦ
#33 #398358
>>398351
Ванюша, у тебя же много красивых трипкодов было.
Что, дурачок, все проебал?
#34 #398403
>>398358
НУ ТУТ ТЕПЕРЬ С ТАКИМИ ЧЕРВЯМИ ПИДОРАМИ В МОДЕРАХ И ВЕБМАКАКАХ Я ОПАСАЮСЬ ТРИПКОДАМИ ПОЬЗОВАТСЯ, РАЗ НО НИМ БАНЯТ ЗНАЧИТ И СПИЗДИТЬ МОГУТ
#35 #398431
>>398403

>С ТАКИМИ ЧЕРВЯМИ ПИДОРАМИ


Совсем как ты.

>ЗНАЧИТ И


Ты и правда глуп.
Нет, не значит.
#36 #398477
>>398274
А я и не говорил, что кресты чем-то лучше.
Тред утонул или удален.
Это копия, сохраненная 13 ноября 2014 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски