private double allocateConditionally( final ThreadLocalRandom rnd ) { final Vector2D v; if( rnd.nextBoolean() ) { v = new Vector2D( 1, rnd.nextDouble() ); } else { v = new Vector2D( rnd.nextDouble(), 1 ); } return v.length(); }не скаляризуется — хотя интуитивно кажется, что скаляризация здесь должна быть тривиальной.
А что если немного добавить аллокаций?
private double allocateConditionally2( final ThreadLocalRandom rnd ) { final Vector2D result = new Vector2D(); if( rnd.nextBoolean() ) { final Vector2D v = new Vector2D( 1, rnd.nextDouble() ); result.copyFrom(v); } else { final Vector2D v = new Vector2D( rnd.nextDouble(), 1 ); result.copyFrom(v); } return result.length(); }В этом коде на одну точку аллокации больше — но все эти аллокации успешно скаляризуются. В общем-то, ничего особо удивительного: здесь каждая ссылочная переменная в любых сценариях исполнения всегда адресует один-единственный объект, поэтому никаких сложностей у скаляризации не возникает :)
А почему ты не пишешь посты по-английски?
ОтветитьУдалитьЯ не настолько хорошо знаю английский, чтобы свободно выражать через него свои мысли со всеми побочными коннотациями. То есть писать на нем я могу, но графоманского удовольствия от этого не получаю :)
УдалитьА во-вторых на английском и так полно информации -- какой смысл?